如何将字符串类型转换为字符数组

How to convert a string type to an array of chars

我正在尝试将一些 C 代码转换为 D,我遇到了这个:

char[] welcome = "\t\tWelcome to the strange land of protected mode!\r\n";

它给出了这个警告:

main.d:5:18: error: cannot implicitly convert expression ("\x09\x09Welcome to the strange land of protected mode!\x0d\x0a") of type string to char[]
    5 | char[] welcome = "\t\tWelcome to the strange land of protected mode!\r\n";
      |                  ^

如何在不单独输入数组中的每个字符的情况下执行此操作?

12.16.1 - Strings

  1. A string is an array of characters. String literals are just an easy way to write character arrays. String literals are immutable (read only).

    char[] str1 = "abc";                // error, "abc" is not mutable
    char[] str2 = "abc".dup;            // ok, make mutable copy
    immutable(char)[] str3 = "abc";     // ok
    immutable(char)[] str4 = str1;      // error, str4 is not mutable
    immutable(char)[] str5 = str1.idup; // ok, make immutable copy
    
  2. The name string is aliased to immutable(char)[], so the above declarations could be equivalently written as:

    char[] str1 = "abc";     // error, "abc" is not mutable
    char[] str2 = "abc".dup; // ok, make mutable copy
    string str3 = "abc";     // ok
    string str4 = str1;      // error, str4 is not mutable
    string str5 = str1.idup; // ok, make immutable copy
    

所以:

char[] welcome = "\t\tWelcome to the strange land of protected mode!\r\n".dup;

如前所述,字符串已经是一个字符数组。其实这里就是string的定义:

alias string = immutable(char)[];

(来自object.d

A string 因此与 char[] 的区别仅在于数组的内容是 immutable.

  • 根据您的目标,您可能根本不需要 char[]string 也可以。
  • 如果您需要数组可写(即您希望 welcome[2] = 'x'; 工作),那么使用 .dup 将在运行时创建一个副本。
  • 有时 C 函数声明没有用 const 正确注释,并且不会接受指向不可变字符的指针。在这种情况下,使用 cast 是可以接受的。
  • 我认为没有语言功能可以像 static char[] s = ['a', 'b', 'c']; 那样将字符串文字直接放置在可写数据段中,但它可能可以作为模板或 CTFE 函数使用。