Rimuovi l'ultimo carattere dalla stringa C ++


210

Come posso rimuovere l'ultimo carattere da una stringa C ++?

Ci ho provato st = substr(st.length()-1);ma non ha funzionato.


6
Vuoi una nuova stringa con l'ultimo carattere rimosso o la stessa stringa senza l'ultimo carattere?
Matthieu M.,

Per un CString MFC Visual C ++: CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
sergiol,

Risposte:


193

Per una versione non mutante:

st = myString.substr(0, myString.size()-1);

20
@MatthieuM. Il tuo esempio è confuso, penso che l'essenza della domanda sia modificare la stringa originale, nel tuo esempio non stai modificando la stringa originale, perché nel tuo esempio la stringa originale si chiama "myString" che dà alla confusione, nella domanda è "st". Il codice dovrebbe essere: 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".
Czarek Tomczak,

1
@CzarekTomczak: Capisco che questo non è esattamente ciò che è stato richiesto, quindi la dichiarazione di non responsabilità prima dell'essenziale.
Matthieu M.

2
@MattPhillips: la sua soluzione è specifica per C ++ 11 ( pop_backnon 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.
Matthieu M.,

404

Soluzione semplice se si utilizza C ++ 11. Probabilmente anche O (1) tempo:

st.pop_back();

49
questo è per c ++ 11!
Amir,

1
Come un FYI - è supportato solo da GCC 4.7 (fuori rotta con l'interruttore di compilazione -std = c ++ 11)
Shmil The Cat

20
Non dimenticare di controllare length().

Sì, sembra troppo in fondo alla pagina ..!
James Bedford,

1
The behavior is undefined if the string is empty. da qui
Raffi,

24
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.


11
Non c'è std::string::pop_backin C ++ 03; è stato aggiunto in C ++ 0x, comunque.
James McNellis,

Ok grazie. Ha causato un po 'di confusione - potrei giurare di averlo usato, ma non è lì. Forse ho una libreria non standard in qualche compilatore da qualche parte (tra VC ++ 2003, VC ++ 2008, MinGW GCC3 MinGW GCC 4 e Linux GCC 4, si ottengono alcune differenze). Più probabilmente, mi sto solo confondendo con altri tipi.
Steve314,

resize () probabilmente non è destinato a tale uso, è una funzione legata alla memoria, erase () serve per eliminare i caratteri.
Czarek Tomczak,

3
@Czarek Tomczak - scusa per la risposta assurdamente in ritardo, ma 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 resizedimensioni 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 .
Steve314

3
se (! str.empty ()) è preferito alle dimensioni
ericcurtin

19
buf.erase(buf.size() - 1);

Ciò presuppone che tu sappia che la stringa non è vuota. In tal caso, otterrai out_of_rangeun'eccezione.


8
buf [buf.size () - 1] = '\ 0'; non rimuove nulla - cambia semplicemente il carattere che era lì per avere il valore zero. std:; le stringhe possono contenere felicemente tali caratteri.

Neil ha ragione. Probabilmente avrei dovuto chiarire questo nella mia risposta. La seconda opzione cambierà effettivamente il valore dell'ultimo carattere in modo che non venga stampato, ma la lunghezza della stringa rimarrà la stessa. L'uso di cancella in realtà "rimuove" l'ultimo carattere e cambierà la dimensione della stringa.
RC.

@RC Verrà stampato, supponendo che tu usi qualcosa come cout << buf. Come apparirà dipenderà dalla tua piattaforma. E puoi sempre chiarire modificando la tua risposta.

Cosa c'è di meglio size() invece end()di un'altra risposta?
Ribamar,

17

str.erase( str.end()-1 )

Riferimento: std :: string :: erase () prototype 2

non è necessario c ++ 11 o c ++ 0x.


1
Questo può portare a una strana situazione: la dimensione della stringa è stata ridotta ma l'ultimo carattere non è impostato su '\ 0'.
Deqing,

1
@Deqing puoi fornire maggiori dettagli su cosa succede in questo caso?
Ribamar,

Per esempio, se si è string s("abc");, dopo la cancellazione sembra lavorare: cout<<s; // prints "ab"però, l'ultimo carattere è ancora lì: cout<<s[2]; // still prints 'c'.
Deqing,

1
facilmente risolto: solostr[str.length()-1] = 0; str.erase(str.end()-1);
taxilian

5
@Dequing: il tuo esempio non è valido. La cancellazione riduce la dimensione della stringa, quindi l'accesso a s[2]è illegale.
EML

11

Questo è tutto ciò di cui hai bisogno:

#include <string>  //string::pop_back & string::empty

if (!st.empty())
    st.pop_back();

9
int main () {

  string str1="123";
  string str2 = str1.substr (0,str1.length()-1);

  cout<<str2; // output: 12

  return 0;
}

2

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

2

str.erase(str.begin() + str.size() - 1)

str.erase(str.rbegin())purtroppo non viene compilato, poiché reverse_iteratornon può essere convertito in un normal_iterator.

C ++ 11 è tuo amico in questo caso.


Anche questo metodo ha problemi, l'ultimo carattere non è impostato su '\ 0'.
Deqing,

1
Qualche motivo particolare per non farlo str.erase(str.end() - 1)?
Vallentin,

-4

Se la lunghezza è diversa da zero, puoi anche

str[str.length() - 1] = '\0';

4
L'impostazione dell'ultimo carattere su \0non modifica la lunghezza della stringa. str.length()sarà impreciso.
JWW

Sì, lo vedo ora. Stiamo considerando il C ++. Hai ragione, non cambia la lunghezza della stringa
Jan Glaser,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.