¿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_back
no 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_back
en C ++ 03; Sin embargo, se ha agregado en C ++ 0x.
resize
es 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 resize
un 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_range
excepció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';
\0
no cambia la longitud de la cadena. str.length()
será inexacto