2009-10-07 15 views

Respuesta

18

c_str() garantiza la terminación NUL. data() no.

+0

Pensé que sería algo simple que había pasado por alto, ¡gracias! – fbrereto

+1

En realidad, sin embargo, probablemente apuntan a lo mismo (no es que deba confiar en él). – Zifre

+6

@Zifre: se puede apuntar a la misma dirección, pero después de una operación mutante (str + = "..."), la aplicación podría dejar el búfer de datos interno sin la terminación nula, y sólo añadir el '\ 0' cuando se llama al método c_str(). –

5

c_str() devuelve un puntero a los datos con un byte NUL adjunto para que pueda utilizar el valor de retorno como una "cadena C".

data() devuelve un puntero a los datos sin ninguna modificación.

Utilice c_str() si el código que está utilizando asume que una cadena está terminada en NUL (como cualquier función escrita para manejar cadenas de caracteres C).

1

Ahora en MS STL 10.0 no parece haber ninguna diferencia, ya que veo esto en la cabecera:

... \ Microsoft Visual Studio 10.0 \ VC \ include \ xstring

const _Elem *c_str() const 
    { // return pointer to null-terminated nonmutable array 
    return (_Myptr()); 
    } 

const _Elem *data() const 
    { // return pointer to nonmutable array 
    return (c_str()); 
    } 

Así que devuelven lo mismo.

+0

También parece que es exactamente el mismo en VC 9.0 también. –

+0

Este es el comportamiento permitido por el estándar actual y requerido por el siguiente. Sospecho que la mayoría de las bibliotecas han estado haciendo esto por un tiempo, en preparación del cambio. –

+0

Gracias Dennis. –

Cuestiones relacionadas