"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿La `string::c_str()` de C++ 11 sigue terminada en nulo?

¿La `string::c_str()` de C++ 11 sigue terminada en nulo?

Publicado el 2024-11-07
Navegar:136

Is C  11\'s `string::c_str()` Still Null-Terminated?

¿String::c_str() de C 11 elimina la terminación nula?

En C 11, ya no se garantiza que string::c_str produce una cadena terminada en nulo.

Razón:

En C 11, string::c_str se define como idéntica a string::data, que a su vez se define como equivalente a *(begin() n) para 0

Consecuencias:

Esto implica que string::c_str() ya no puede devolver una cadena terminada en nulo, lo que genera errores potenciales en escenarios que asumen dicha terminación.

Solución:

La solución es usar string::c_str() solo para compatibilidad con código heredado. Para código nuevo, use string::data() en su lugar. Si bien string::data() no devuelve una cadena terminada en nulo, devuelve un puntero al búfer subyacente, que se garantiza que tendrá una terminación nula internamente.

Detalles de implementación:

Internamente, ahora se requiere que las cadenas utilicen buffers terminados en nulo. La definición de operador[] en la sección 21.4.5 requiere que para size()

Notas adicionales:

  • &operator[](0) se puede utilizar como sinónimo de c_str().
  • El carácter nulo de terminación debe estar en el mismo búfer que los datos de la cadena, ya que *(p size()) debe ser igual a charT(). Por lo tanto, incluso si el carácter nulo se inicializa de forma diferida, no es posible observar el búfer en un estado intermedio.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3