2012-01-10 9 views
6

Tengo un puntero de char estándar que estoy tratando de lanzar a una cadena.Cómo lanzar un char * a una cuerda en D?

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

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

¡Error!

¿Alguna idea de cómo lanzar un char * a una secuencia en D?

+5

pst: los literales de cadena ya tienen '\ 0' añadido –

+0

¿Por qué si la longitud ya se conoce a través del puntero de grasa? Para la compatibilidad C? –

+1

@Daevius, sí, de esta manera cuando llama a una función C no tiene que envolver todos sus literales de cadena con toStringZ. –

Respuesta

14

Usa std.conv.to para convertir de char* a string. Use std.string.toStringZ para ir por el otro lado.

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

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

Si conoce la longitud exacta que usted puede hacer esto:

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

string str = cptr[0..len]; 

Para algunos casos (como si la cadena contiene \0) que se necesita.

+0

Creo que 'len' debe ser del tipo' size_t'. –

Cuestiones relacionadas