Comment supprimer le dernier caractère d'une chaîne C ++?
J'ai essayé st = substr(st.length()-1);
Mais ça n'a pas marché.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Comment supprimer le dernier caractère d'une chaîne C ++?
J'ai essayé st = substr(st.length()-1);
Mais ça n'a pas marché.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Réponses:
Pour une version non mutante:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
. Mais il ne semble toujours pas la bonne, je pense que la bonne façon est d'utiliser la fonction qui est destinée à cette tâche, il est appelé effacement () et le code est: st.erase(st.size()-1)
. Cela s'appellerait une "version mutante".
pop_back
n'existait pas en C ++ 03) et c'est aussi une modification sur place (et l'OP n'a jamais précisé s'il voulait ou non sur place) ... comme tel, il a une bonne réponse, mais pas la seule possible.
Solution simple si vous utilisez C ++ 11. Probablement O (1) également:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
Une alternative à std :: erase est bonne, mais j'aime le "- 1" (qu'il soit basé sur une taille ou un itérateur final) - pour moi, cela aide à exprimer l'intention.
BTW - N'y a-t-il vraiment pas std :: string :: pop_back? - semble étrange.
std::string::pop_back
en a pas en C ++ 03; il a cependant été ajouté en C ++ 0x.
resize
c'est une fonction de redimensionnement, et non plus une fonction de mémoire que toute autre chose qui pourrait augmenter la mémoire nécessaire. Par exemple, si vous avez resize
une taille plus petite, cela ne réduira pas la mémoire réservée. Je pense que vous pensez à reserve
, ce qui pourrait au moins réduire la mémoire allouée si on vous le demande - voir redimensionner ici et réserver ici .
buf.erase(buf.size() - 1);
Cela suppose que vous savez que la chaîne n'est pas vide. Si c'est le cas, vous obtiendrez une out_of_range
exception.
size()
place end()
d'une autre réponse?
str.erase( str.end()-1 )
Référence: std :: string :: erase () prototype 2
aucun c ++ 11 ou c ++ 0x n'est nécessaire.
string s("abc");
, après effacement , il semble fonctionner: 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.
Avec C ++ 11, vous n'avez même pas besoin de la longueur / taille. Tant que la chaîne n'est pas vide, vous pouvez effectuer les opérations suivantes:
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())
ne compile malheureusement pas, car reverse_iterator
ne peut pas être converti en un normal_iterator.
C ++ 11 est votre ami dans ce cas.
str.erase(str.end() - 1)
?
Si la longueur est non nulle, vous pouvez également
str[str.length() - 1] = '\0';
\0
ne modifie pas la longueur de la chaîne. str.length()
sera inexact.