¿Std :: string contiene un terminador nulo?

¿La cadena siguiente contiene el terminador nulo ‘\ 0’?

std::string temp = "hello whats up"; 

¡Gracias! 🙂

No, pero si dices temp.c_str() un terminador nulo en la devolución de este método.

También vale la pena decir que puedes incluir un carácter nulo en una cadena como cualquier otro personaje.

 string s("hello"); cout << s.size() << ' '; s[1] = '\0'; cout << s.size() << '\n'; 

huellas dactilares

5 5

y no 5 1 como cabría esperar si los caracteres nulos tienen un significado especial para las cadenas.

No en C ++ 03, y ni siquiera está garantizado antes de C ++ 11 que en C ++ std :: string sea continuo en la memoria. Solo las cadenas C (matrices de caracteres que están destinadas a almacenar cadenas) tenían el terminador nulo.

En C ++ 11 y mystring.c_str() posteriores, mystring.c_str() es equivalente a mystring.data() es equivalente a &mystring[0] , y se garantiza que mystring[mystring.size()] será '\0' .

Sí, si llama a temp.c_str() , devolverá c-string terminada en nulo.

Sin embargo, los datos reales almacenados en la temp del objeto pueden no ser terminados en nulo, pero no importan y no deberían importarle al progtwigdor, porque cuando el progtwigdor quiera const char* , llamaría a c_str() sobre el objeto , que está garantizado para devolver una cadena terminada en nulo.

Esto depende de tu definición de ‘contener’ aquí. En

 std::string temp = "hello whats up"; 

hay algunas cosas para tener en cuenta:

  • temp.size() devolverá el número de caracteres desde la primera hasta la última p
  • Pero al mismo tiempo, temp.c_str() o temp.data() volverán con un terminador null
  • O en otras palabras int(temp[temp.size()]) será cero

Lo sé, sueno similar a algunas de las respuestas aquí, pero quiero señalar que el size de std::string en C++ se mantiene por separado y no es como en C donde sigues contando a menos que encuentres el primer terminador null .

Para agregar, la historia sería un poco diferente si su string literal contiene embedded \0 . En este caso, la construcción de std::string detiene al primer carácter null , como sigue:

 std::string s1 = "ab\0\0cd"; // s1 contains "ab", using string literal std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd", using different ctr std::string s3 = "ab\0\0cd"s; // s3 contains "ab\0\0cd", using ""s operator 

Referencias

Con las cadenas de C ++ no tiene que preocuparse por eso, y es posiblemente dependiente de la implementación.

Usando temp.c_str() obtienes una representación C de la cadena, que definitivamente contendrá el carácter \0 . Aparte de eso, realmente no veo cómo sería útil en una cadena de C ++

std::string internamente cuenta el número de caracteres. Internamente funciona usando este conteo. Como han dicho otros, cuando necesites la cadena para mostrar o cualquier otra razón, puedes c_str() método c_str() que te dará la cadena con el terminador nulo al final.