"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > O `string::c_str()` do C++ 11 ainda é terminado em nulo?

O `string::c_str()` do C++ 11 ainda é terminado em nulo?

Publicado em 2024-11-07
Navegar:928

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

A string::c_str() do C 11 elimina a terminação nula?

Em C 11, string::c_str não é mais garantido para produz uma string terminada em nulo.

Motivo:

Em C 11, string::c_str é definido como idêntico a string::data, que por sua vez é definido como equivalente a *(begin() n) para 0

Consequências:

Isso implica que string::c_str() não pode mais retornar uma string terminada em nulo, levando a possíveis erros em cenários que assumem tal terminação.

Solução:

A solução é usar string::c_str() apenas para compatibilidade com código legado. Para novo código, use string::data() em vez disso. Embora string::data() não retorne uma string terminada em nulo, ela retorna um ponteiro para o buffer subjacente, que é garantido como terminado em nulo internamente.

Detalhes de implementação:

Internamente, as strings agora são obrigadas a usar buffers terminados em nulo. A definição de operador[] na seção 21.4.5 requer que para size()

Notas adicionais:

  • &operator[](0) pode ser usado como sinônimo de c_str().
  • O caractere nulo de terminação deve estar no mesmo buffer dos dados da string, pois *(p size()) deve ser igual a charT(). Assim, mesmo que o caracter nulo seja inicializado lentamente, não é possível observar o buffer em um estado intermediário.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3