A string abaixo conterá o terminador nulo '\ 0'?
std::string temp = "hello whats up";
Obrigado! :)
A string abaixo conterá o terminador nulo '\ 0'?
std::string temp = "hello whats up";
Obrigado! :)
Respostas:
Não, mas se você disser, temp.c_str()
um terminador nulo será incluído no retorno desse método.
Também vale a pena dizer que você pode incluir um caractere nulo em uma string como qualquer outro caractere.
string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';
estampas
5 5
e não 5 1
como você poderia esperar se os caracteres nulos tivessem um significado especial para strings.
temp.c_str()
o caractere nulo será incluído. Se você realmente precisar dele na string, basta adicioná-lo como qualquer outro caractere. temp.push_back('\0')
. Agora temp.c_str()
incluirá dois caracteres nulos.
Não em C ++ 03, e nem mesmo é garantido antes de C ++ 11 que em uma C ++ std :: string seja contínua na memória. Apenas strings C (matrizes de caracteres destinadas ao armazenamento de strings) tinham o terminador nulo.
No C ++ 11 e posterior, mystring.c_str()
é equivalente a mystring.data()
é equivalente a &mystring[0]
e mystring[mystring.size()]
é garantido que seja '\0'
.
Isso depende da sua definição de 'conter' aqui. No
std::string temp = "hello whats up";
há algumas coisas a serem observadas:
temp.size()
retornará o número de caracteres do primeiro h
ao último p
(ambos inclusivos)temp.c_str()
ou temp.data()
vai voltar com um null
terminadorint(temp[temp.size()])
será zeroEu sei, pareço com algumas das respostas aqui, mas quero salientar que size
de std::string
em C++
é mantido separadamente e não é como em C
onde você continua contando a menos que encontre o primeiro null
terminador.
Para adicionar, a história seria um pouco diferente se você string literal
contivesse incorporado \0
. Nesse caso, a construção das std::string
paradas no primeiro null
caractere, conforme segue:
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
Referências:
Sim, se você chamar temp.c_str()
, ele retornará uma string C terminada em nulo.
No entanto, os dados reais armazenados no objeto temp
não podem ter terminação nula, mas não importa e não deve importar para o programador, porque quando o programador quiser const char*
, ele chamaria c_str()
o objeto, que é garantido para retornar nulo string terminada.
temp.size()
.
std::string
mantém internamente uma contagem do número de caracteres. Internamente funciona usando esta contagem. Como outros disseram, quando você precisa da string para exibição ou qualquer outro motivo, você pode c_str()
usar seu método que fornecerá a string com o terminador nulo no final.