#d
#d
Вопрос:
Это так просто, что мне неловко спрашивать, но как преобразовать строку c в строку d в D2?
У меня есть два варианта использования.
string convert( const(char)* c_str );
string convert( const(char)* c_str, size_t length );
Ответ №1:
-
Используйте std.string.toString(char*) (D1/Phobos) или std.conv.to !(строка) (D2):
// D1 import std.string; ... string s = toString(c_str); // D2 import std.conv; ... string s = to!(string)(c_str);
-
Срежьте указатель:
string s = c_str[0..len];
(вы не можете использовать «length», потому что оно имеет особое значение в синтаксисе slice).
Оба варианта вернут фрагмент поверх строки C (таким образом, ссылку, а не копию). Используйте свойство .dup для создания копии.
Обратите внимание, что строки D считаются в кодировке UTF-8. Если ваша строка в другой кодировке, вам нужно будет преобразовать ее (например, используя функции из std.windows.charset).
Комментарии:
1.
toString
не рекомендуется в D2.2. @Caspin: Используйте
to!string
ortext
изstd.conv
модуля.3. Строка IIRC неизменяема, поэтому для случая 2 вам нужно будет выполнить приведение (если вы знаете, что c-строка неизменяема или
.idup
для других случаев.4. @The Elite: Да, это так, и если вам нравится C , вам следует взглянуть на D. (Имейте в виду, что экосистема на данный момент немного незрелая).
5. @CyberShadow, D1 не предлагает достаточных преимуществ перед c , чтобы привлечь мой интерес. В частности, меня заинтересовал синтаксис шаблона D2, и контейнеры на основе диапазона вместо итераторов, и …