Как правильно привести wstring к wchar *?(или строка в символ *) - PullRequest
7 голосов
/ 05 июня 2011

[Я новичок в D (в настоящее время пишу свою первую полезную программу), и у меня не так много C-фона - только немного C # и другие, в основном языки без указателей.]'\ 0' к wstring перед кастом?Это единственный способ гарантировать, что мой wchar * будет иметь нулевое окончание?Когда он приведен, это новая копия wstring или он просто получает указатель на ту же самую wstring, которую вы используете?

Ответы [ 3 ]

9 голосов
/ 05 июня 2011

Для вызова функций Windows * W используйте http://www.digitalmars.com/d/2.0/phobos/std_utf.html#toUTF16z

Также обратите внимание, что строковые литералы уже заканчиваются на 0, поэтому вы можете передавать их напрямую.

9 голосов
/ 05 июня 2011

Функции toStringz преобразуют строки D в строки с нулем в конце в стиле C.

immutable(char)* toStringz(const(char)[] s); 
immutable(char)* toStringz(string s);

например,

string s;
immutable(char)* cstr = s.toStringz();
//or: toStringz(s);

toStringz выделяет новую строку только в кучеесли строка еще не завершена нулем, в противном случае она просто возвращает s.ptr.

8 голосов
/ 05 июня 2011

Если вам просто нужен указатель, правильный способ - использовать свойство ptr (доступно для всех динамических массивов, а не только для строк)

str.ptr

Однако, если вы хотите что-то использовать с C, чтобы убедиться, что оно завершено нулем, используйте toStringz

import std.string;
toStringz(str);

toStringz не будет выполнять копирование, если строка уже обнуляется.

...