Как преобразовать строковый тип в массив символов - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь перевести некоторый код 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 ]

4 голосов
/ 17 мая 2019

Как уже упоминалось, строки уже являются массивом символов. На самом деле, вот определение 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.
3 голосов
/ 17 мая 2019

12.16.1 - Строки

  1. A 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. Строка имени имеет псевдоним 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
    

Итак:

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