Come posso rimuovere l'ultimo carattere da una stringa C ++?
Ci ho provato st = substr(st.length()-1);
ma non ha funzionato.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Come posso rimuovere l'ultimo carattere da una stringa C ++?
Ci ho provato st = substr(st.length()-1);
ma non ha funzionato.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Risposte:
Per una versione non mutante:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1)
. Ma ancora non sembra il modo giusto, penso che il modo corretto è quello di utilizzare la funzione che è destinato per questo compito, si chiama erase () e il codice è il seguente: st.erase(st.size()-1)
. Questa sarebbe chiamata "versione mutante".
pop_back
non esisteva in C ++ 03) ed è anche una modifica sul posto (e l'OP non ha mai chiarito se voleva sul posto o meno) ... come tale, ha una risposta corretta, ma non l'unica possibile.
Soluzione semplice se si utilizza C ++ 11. Probabilmente anche O (1) tempo:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
Un'alternativa std :: erase è buona, ma mi piace il "- 1" (che sia basato su una dimensione o un iteratore finale) - per me, aiuta a esprimere l'intento.
A proposito: non c'è davvero nessun std :: string :: pop_back? - sembra strano.
std::string::pop_back
in C ++ 03; è stato aggiunto in C ++ 0x, comunque.
resize
è una funzione di ridimensionamento e non più una funzione di memoria di qualsiasi altra cosa che potrebbe aumentare la memoria necessaria. Ad esempio, se hai resize
dimensioni inferiori, non ridurrà la memoria riservata. Penso che tu stia pensando reserve
, che almeno potrebbe ridurre la memoria allocata se ti viene chiesto - vedi ridimensionare qui e prenotare qui .
buf.erase(buf.size() - 1);
Ciò presuppone che tu sappia che la stringa non è vuota. In tal caso, otterrai out_of_range
un'eccezione.
size()
invece end()
di un'altra risposta?
str.erase( str.end()-1 )
Riferimento: std :: string :: erase () prototype 2
non è necessario c ++ 11 o c ++ 0x.
string s("abc");
, dopo la cancellazione sembra lavorare: cout<<s; // prints "ab"
però, l'ultimo carattere è ancora lì: cout<<s[2]; // still prints 'c'
.
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]
è illegale.
Con C ++ 11, non hai nemmeno bisogno della lunghezza / dimensione. Finché la stringa non è vuota, è possibile effettuare le seguenti operazioni:
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())
purtroppo non viene compilato, poiché reverse_iterator
non può essere convertito in un normal_iterator.
C ++ 11 è tuo amico in questo caso.
str.erase(str.end() - 1)
?
Se la lunghezza è diversa da zero, puoi anche
str[str.length() - 1] = '\0';
\0
non modifica la lunghezza della stringa. str.length()
sarà impreciso.