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

时间:2019-05-16 23:02:07

标签: d implicit-conversion

我正在尝试将一些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";
      |                  ^

该如何在不分别键入数组中每个字符的情况下执行此操作?

2 个答案:

答案 0 :(得分:4)

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

alias string = immutable(char)[];

(来自object.d

因此stringchar[]的不同之处仅在于数组的内容为immutable

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

答案 1 :(得分:3)

12.16.1 - Strings

  
      
  1. string是一个字符数组。字符串文字只是编写字符数组的一种简便方法。字符串文字是不可变的   (只读)。

         
    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.   
  3. 名称字符串的别名为immutable(char)[],因此上述声明可以等效地写为:

         
    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
    
  4.   

所以:

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