Как да прехвърлям char* към низ в D?

Имам стандартен указател char, който се опитвам да прехвърля към низ.

// string to char*
char *x = cast(char*)("Hello World\0");

// char* to string?
string x = cast(string)x;
string x = cast(immutable(char)[])x;

грешка!

Някакви идеи как да прехвърлям char* към низ в D?


person Gary Willoughby    schedule 10.01.2012    source източник
comment
pst: низови литерали вече имат добавени \0   -  person ratchet freak    schedule 11.01.2012
comment
Защо е така, ако дължината вече е известна чрез дебелия показалец? За C съвместимост?   -  person Taco de Wolff    schedule 11.01.2012
comment
@Daevius, Да, по този начин, когато извиквате C функция, не е нужно да обвивате всичките си низови литерали с toStringZ.   -  person he_the_great    schedule 11.01.2012


Отговори (2)


Използвайте std.conv.to, за да конвертирате от char* в string. Използвайте std.string.toStringZ, за да отидете в другата посока.

import std.string;
import std.stdio;
import std.conv;

void main()
{
    immutable(char)* x = "Hello World".toStringz();
    auto s = to!string(x);
    writeln(s);
}
person eco    schedule 10.01.2012

Ако знаете точната дължина, можете да направите това:

immutable(char)* cptr = obj.SomeSource();
int len = obj.SomeLength();

string str = cptr[0..len];

За някои случаи (например ако низът съдържа \0) това е необходимо.

person BCS    schedule 11.01.2012
comment
Мисля, че len трябва да е от тип size_t. - person Taco de Wolff; 11.01.2012