¿Por qué me quiero volver a llamar std::string::data()
sobre std::string::c_str()
? Seguramente hay algún método para la locura de la norma aquí ...¿Cuál es la diferencia entre std :: string :: c_str y std :: string :: data?
Respuesta
c_str() garantiza la terminación NUL. data() no.
Pensé que sería algo simple que había pasado por alto, ¡gracias! – fbrereto
En realidad, sin embargo, probablemente apuntan a lo mismo (no es que deba confiar en él). – Zifre
@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(). –
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).
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.
También parece que es exactamente el mismo en VC 9.0 también. –
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. –
Gracias Dennis. –
- 1. ¿Cuál es la diferencia entre std :: string y std :: basic_string? ¿Y por qué se necesitan ambos?
- 2. std :: string :: longitud() vs. std :: string :: size()
- 3. ¿std :: string :: c_str() siempre devuelve una cadena terminada en nulo?
- 4. ¿Cuál es la diferencia entre std :: merge y std :: set_union?
- 5. ¿Cuál es la diferencia entre std :: valarray y std :: array
- 6. ¿Cuál es la diferencia entre std :: condition_variable y std :: condition_variable_any?
- 7. ¿Cuál es la diferencia entre std :: set y std :: vector?
- 8. ¿Cuál es la diferencia entre Double.parseDouble (String) y Double.valueOf (String)?
- 9. Cómo convertir CString y :: std :: string :: std :: wstring entre sí?
- 10. Cython C++ y std :: string
- 11. Rendimiento std :: strstr vs std :: string :: encontrar
- 12. Diferencia entre @string y @ + string?
- 13. SWIG: Cómo ajustar std :: string & (std :: string pasado por referencia)
- 14. ¿Es legal escribir en std :: string?
- 15. ¿Cómo puedo tomar posesión de un C++ std :: string char data sin copiar y mantener el objeto std :: string?
- 16. Cómo convertir System :: String^en std :: string?
- 17. operator std :: string() const?
- 18. std :: string vs. char *
- 19. std :: vector <std::string> crash
- 20. Diferencia entre String [] a y String ... a
- 21. std :: move entre std :: string y std :: vector <unsigned char>
- 22. ¿Hereda y reemplaza funciones de std :: string?
- 23. C++ std :: string to boolean
- 24. boost :: ifind_first con std :: string objects
- 25. ¿std :: string es parte del STL?
- 26. ¿Cuál es la diferencia entre CharSequence [] y un String []?
- 27. ¿Cuál es la diferencia entre string y StringBuilder?
- 28. ¿Por qué no es std :: string :: max_size() == std :: string :: allocator :: max_size()
- 29. std :: string :: assign() causa segfault
- 30. Unicode std :: string class replacement
Solo quisiera señalar que en la próxima versión de C++ [C++ 11 o C++ 0x o como quiera llamarlo], las dos funciones son sinónimos por definición. –