Supprimer le dernier caractère de chaîne C++
Comment puis-je supprimer le dernier caractère d'une chaîne C++?
J'ai essayé st = substr(st.length()-1);
Mais il ne fonctionne pas.
- Voulez-vous une nouvelle chaîne avec le dernier caractère supprimé ou la même chaîne sans le dernier caractère ?
- Pour une MFC, Visual C++ CString:
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Vous devez vous connecter pour publier un commentaire.
Pour un non-mutation version:
st = st.substr(0, st.size()-1)
. Mais encore, elle n'a pas l'air de la bonne façon, je pense que la bonne façon est d'utiliser la fonction qui est prévu pour cette tâche, il est appelé à effacer() et le code est:st.erase(st.size()-1)
. Ce serait appelé une "mutation de la version".pop_back
n'existe pas en C++03) et c'est aussi une modification (et les OP ne jamais précisé s'il voulait en place ou pas)... en tant que tel, il est a réponse correcte, mais pas la seule possible.La solution la plus Simple si vous êtes à l'aide de C++11. Probablement O(1) le temps:
length()
.The behavior is undefined if the string is empty.
à partir de iciUn std::erase alternative est bonne, mais j'aime bien le "- 1" (basé sur la taille ou à la fin itérateur) - pour moi, ça m'aide exprime l'intention.
BTW Est - il vraiment pas de std::string::pop_back ? - semble étrange.
std::string::pop_back
en C++03; qu'il a été ajouté dans C++0x.resize
est une fonction de redimensionnement, et non plus une fonction de mémoire que tout ce qui pourrait augmenter la mémoire nécessaire. Par exemple, si vousresize
à une taille plus petite, il va pas réduire la quantité de mémoire réservée. Je pense que vous êtes la pensée dereserve
, dont au moins à réduire la mémoire allouée en cas de demande d' - voir redimensionner ici et région.Cela suppose que vous savez que la chaîne n'est pas vide. Si oui, vous aurez une
out_of_range
exception.size()
au lieu deend()
d'une autre réponse?str.erase( str.end()-1 )
Référence: std::string::erase() prototype 2
pas de c++11 et c++0x nécessaire.
string s("abc");
, après l'effacer semble de travail:cout<<s; // prints "ab"
, cependant, le dernier caractère est toujours là:cout<<s[2]; // still prints 'c'
.str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
est illégal.C'est tout ce dont vous avez besoin:
Avec C++11, vous n'avez même pas besoin de la longueur. Tant que la chaîne n'est pas vide, vous pouvez effectuer les opérations suivantes:
str.erase(str.begin() + str.size() - 1)
str.erase(str.rbegin())
ne compile pas, malheureusement, depuisreverse_iterator
ne peut pas être converti en normal_iterator.C++11 est ton ami dans ce cas.
str.erase(str.end() - 1)
?Si la longueur est différente de zéro, vous pouvez également
\0
ne change pas la longueur de la chaîne.str.length()
sera inexacte.