2012-10-02 18 views
8

Duplicar posible:
string c_str() vs. data()¿std :: string :: c_str() siempre devuelve una cadena terminada en nulo?

utilizo para convertir strncpy(dest, src_string, 32)std::string a char[32] para hacer mi clases de C++ trabajan con código heredado C. Pero, ¿el método c_str() de std :: string siempre devuelve una cadena terminada en nulo?

+3

sí, pero es posible que no copiándolo sobre si su 'strncpy' es demasiado pequeño. Digamos que su terminador nulo está en el índice 40 y solo copia 32 más. Ya no terminó nulo. –

+1

'c_str()' devuelve la cadena C, definida por el estándar C como terminada en nulo. Yo llamo a esto una pregunta no real, porque todo lo que tenemos que hacer aquí es explicar lo que significa "Cadena C", que realmente no encaja en este sitio. – Griwes

+0

@Griwes No creo que esto deba cerrarse porque NARQ, RTFM sería una razón más apropiada para cerrar :) – Praetorian

Respuesta

20

¿El método c_str() de std :: string siempre devuelve una cadena terminada en nulo?

Sí.

especificación de Es:

Devuelve: Un puntero p tal que p + i == &operator[](i) para cada i en [0,size()].

Tenga en cuenta que el rango especificado para i está cerrado, por lo que size() es un índice válido, refiriéndose al personaje más allá del final de la cadena.

operator[] se especifica así:

Devuelve: *(begin() + pos) si pos < size(), de lo contrario una referencia a un objeto de tipo T con valor charT()

En el caso de std::string, que es un alias para std::basic_string<char> para que charT sea char, un valor char tiene el valor cero; por lo tanto, la matriz de caracteres apuntada por el resultado de std::string::c_str() tiene terminación cero.

+1

Parece que vale la pena mencionar que también puede haber NUL incrustados. Es decir, es bastante posible construir una cadena std :: que contenga caracteres NUL, simplemente haciendo str.push_back (0) ;. Esta es una ventaja de usar str :: string, pero algo que debe tenerse en cuenta. Por otra parte, es inusual que una std :: string contenga un NUL incrustado y en muchos usos de std :: string tal cosa nunca sucederá, no aparecerán mágicamente. Entonces, solo tenlo en cuenta. –

1

Según this, la respuesta es sí.

+1

Whoa, uso ese sitio todo el tiempo, ¿por qué es malo? –

+8

@nightcracker: El lenguaje vulgar es innecesario, como es la crítica. Sí, cplusplus.com tiene (¿tuvo?) Errores y ejemplos de 'meh', pero por cualquier razón eso se apoderó de "oh esta es mi oportunidad de odiar algo más allá de lo que es crítica razonable". Vamos a cortarlo. Personalmente voy allí de vez en cuando para obtener una referencia rápida, a través del motor de búsqueda. Además, no todas las respuestas necesitan una cita estándar. – GManNickG

+1

@Griwes: De hecho; Al igual que cualquier publicación en la historia de la publicación, es posible encontrar un puñado de errores o malas elecciones de redacción si te fijas lo suficiente. Todos los importantes en esa diatriba particular han sido arreglados hace mucho tiempo. –

11

c_str devuelve una "cadena C". Y las cadenas C siempre terminan con un carácter nulo. Este es el estándar C

Null terminating strings.

Cuestiones relacionadas