Como posso remover o último caractere de uma string C ++?
Eu tentei st = substr(st.length()-1);
Mas não funcionou.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Como posso remover o último caractere de uma string C ++?
Eu tentei st = substr(st.length()-1);
Mas não funcionou.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Respostas:
Para uma versão sem mutação:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
. Mas ainda não parece o caminho certo, eu acho que a maneira correta é usar a função que se pretende para esta tarefa, é chamado de apagar () e o código é: st.erase(st.size()-1)
. Isso seria chamado de "versão mutante".
pop_back
não existia no C ++ 03) e também é uma modificação no local (e o OP nunca esclareceu se ele queria o local ou não) ... como assim, ele tem uma resposta correta, mas não a única possível.
Solução simples se você estiver usando o C ++ 11. Provavelmente também o tempo O (1):
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
Uma alternativa std :: erase é boa, mas eu gosto do "- 1" (seja com base no tamanho ou no iterador final) - para mim, isso ajuda a expressar a intenção.
BTW - Não existe realmente std :: string :: pop_back? parece estranho.
std::string::pop_back
no C ++ 03; foi adicionado em C ++ 0x, no entanto.
resize
é uma função de redimensionamento e não mais uma função de memória que qualquer outra coisa que possa aumentar a memória necessária. Por exemplo, se você resize
usar um tamanho menor, isso não reduzirá a memória reservada. Eu acho que você está pensando reserve
, o que pelo menos pode reduzir a memória alocada se solicitado - veja redimensionar aqui e reserve aqui .
buf.erase(buf.size() - 1);
Isso pressupõe que você saiba que a sequência não está vazia. Nesse caso, você receberá uma out_of_range
exceção.
size()
vez end()
de outra resposta?
str.erase( str.end()-1 )
Referência: std :: string :: erase () prototype 2
não é necessário c ++ 11 ou c ++ 0x.
string s("abc");
, depois de apagá-lo parece trabalhar: cout<<s; // prints "ab"
, no entanto, o último personagem ainda está lá: cout<<s[2]; // still prints 'c'
.
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
é ilegal.
Com o C ++ 11, você nem precisa do comprimento / tamanho. Desde que a sequência não esteja vazia, você pode fazer o seguinte:
if (!st.empty())
st.erase(std::prev(st.end())); // Erase element referred to by iterator one
// before the end
str.erase(str.begin() + str.size() - 1)
str.erase(str.rbegin())
infelizmente não compila, já que reverse_iterator
não pode ser convertido em um normal_iterator.
C ++ 11 é seu amigo neste caso.
str.erase(str.end() - 1)
?
Se o comprimento for diferente de zero, você também pode
str[str.length() - 1] = '\0';
\0
não altera o comprimento da sequência. str.length()
será impreciso.