¿Cómo puedo eliminar el último carácter de una cadena de C ++?
Lo intenté st = substr(st.length()-1);pero no funcionó.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
¿Cómo puedo eliminar el último carácter de una cadena de C ++?
Lo intenté st = substr(st.length()-1);pero no funcionó.
CString str=CString("Hello world"); str.Delete(str.GetLength()-1);
Respuestas:
Para una versión no mutante:
st = myString.substr(0, myString.size()-1);
st = st.substr(0, st.size()-1). Pero todavía no se ve de la manera correcta, creo que es la forma correcta de utilizar la función que se pretende para esta tarea, se llama borrado () y el código es: st.erase(st.size()-1). Esto se llamaría una "versión mutante".
pop_backno existía en C ++ 03) y también es una modificación en el lugar (y el OP nunca aclaró si quería en el lugar o no) ... como tal, él tiene una respuesta correcta, pero no la única posible.
Solución simple si está utilizando C ++ 11. Probablemente O (1) tiempo también:
st.pop_back();
if (str.size () > 0) str.resize (str.size () - 1);
Una alternativa std :: erase es buena, pero me gusta el "- 1" (ya sea basado en un tamaño o en un iterador final), para mí, ayuda a expresar la intención.
Por cierto, ¿realmente no hay std :: string :: pop_back? - parece extraño.
std::string::pop_backen C ++ 03; Sin embargo, se ha agregado en C ++ 0x.
resizees una función de cambio de tamaño y no más una función de memoria que cualquier otra cosa que pueda aumentar la memoria necesaria. Por ejemplo, si tiene resizeun tamaño más pequeño, no reducirá la memoria reservada. Creo que está pensando reserve, lo que al menos podría reducir la memoria asignada si se le solicita: vea cambiar el tamaño aquí y reservar aquí .
buf.erase(buf.size() - 1);
Esto supone que sabe que la cadena no está vacía. Si es así, obtendrás una out_of_rangeexcepción.
size() lugar end()de otra respuesta?
str.erase( str.end()-1 )
Referencia: std :: string :: erase () prototype 2
no se necesita c ++ 11 o c ++ 0x.
string s("abc");, después de borrado parece trabajar: cout<<s; // prints "ab"Sin embargo, el último carácter sigue ahí: cout<<s[2]; // still prints 'c'.
str[str.length()-1] = 0; str.erase(str.end()-1);
s[2]es ilegal.
int main () {
string str1="123";
string str2 = str1.substr (0,str1.length()-1);
cout<<str2; // output: 12
return 0;
}
Con C ++ 11, ni siquiera necesita la longitud / tamaño. Mientras la cadena no esté vacía, puede hacer lo siguiente:
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()) lamentablemente no se compila, ya que reverse_iterator que no se puede convertir a un normal_iterator.
C ++ 11 es tu amigo en este caso.
str.erase(str.end() - 1)?
Si la longitud no es cero, también puede
str[str.length() - 1] = '\0';
\0no cambia la longitud de la cadena. str.length()será inexacto