Eliminar el último carácter de la cadena C++

4 minutos de lectura

¿Cómo puedo eliminar el último carácter de una cadena de C++?

Lo intenté st = substr(st.length()-1); Pero no funcionó.

  • ¿Quiere una nueva cadena con el último carácter eliminado o la misma cadena sin el último carácter?

    – Matthieu M.

    22 de febrero de 2010 a las 12:58

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

    – sergiol

    11/10/2017 a las 18:20


avatar de usuario
mpgaillard

Solución simple si está utilizando C++ 11. Probablemente O (1) tiempo también:

st.pop_back();

  • Como FYI, solo se admite desde GCC 4.7 (por supuesto, junto con el interruptor de compilación -std = c ++ 11)

    – Shmil el gato

    7 febrero 2014 a las 8:15


  • No olvides revisar length().

    usuario1382306

    25 de julio de 2014 a las 16:01

  • Sí, aparece demasiado abajo en la página..!

    –James Bedford

    26 de agosto de 2016 a las 18:21

  • Sería bueno agregar la forma más conveniente de eliminar también los últimos caracteres X.

    – FvD

    6 sep 2018 a las 10:29

  • The behavior is undefined if the string is empty. de aquí

    – Rafi

    28 de junio de 2019 a las 12:36

Para una versión no mutante:

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

  • @MatthieuM. Su ejemplo es confuso, creo que la esencia de la pregunta es modificar la cadena original, en su ejemplo no está modificando la cadena original, porque en su ejemplo la cadena original se llama “myString”, lo que genera confusión. en la pregunta es “st”. Su código debe ser: st = st.substr(0, st.size()-1). Pero todavía no se ve de la manera correcta, creo que la forma correcta es usar la función destinada a esta tarea, se llama erase() y el código es: st.erase(st.size()-1). Esto se llamaría una “versión mutante”.

    – Zarek Tomczak

    19 de enero de 2013 a las 14:46


  • @CzarekTomczak: Entiendo que esto no es exactamente lo que se solicitó, por lo tanto, el descargo de responsabilidad antes de la esencia real.

    – Matthieu M.

    19 de enero de 2013 a las 15:05

  • @MattPhillips: aunque su solución es específica de C++ 11 (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, tiene a respuesta correcta, pero no la única posible.

    – Matthieu M.

    21 de mayo de 2013 a las 6:24

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 iterador final); para mí, ayuda a expresar la intención.

Por cierto, ¿realmente no hay std::string::pop_back? – parece extraño.

  • No hay std::string::pop_back en C++03; sin embargo, se ha agregado en C++ 0x.

    –James McNellis

    22 de febrero de 2010 a las 14:20

  • Bueno, gracias. Causó un poco de confusión: podría jurar que lo he usado, pero no está allí. Tal vez tengo una biblioteca no estándar en algún compilador en algún lugar (entre VC++2003, VC++2008, MinGW GCC3 MinGW GCC 4 y Linux GCC 4, hay algunas diferencias). Lo más probable es que me confunda con otros tipos.

    usuario180247

    22 de febrero de 2010 a las 14:31

  • resize() probablemente no esté diseñado para tal uso, es una función relacionada con la memoria, erase() es para eliminar caracteres.

    – Zarek Tomczak

    19 de enero de 2013 a las 14:36


  • @Czarek Tomczak: perdón por la respuesta absurdamente tardía, pero 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 usted resize a un tamaño más pequeño, será no reducir la memoria reservada. Creo que estás pensando en reserveque al menos puede que reducir la memoria asignada si se le solicita – ver cambiar el tamaño aquí y reserva aquí.

    usuario180247

    5 de marzo de 2014 a las 6:53

  • si (!str.empty()) se prefiere sobre el tamaño

    – Ericcurtin

    9 de julio de 2018 a las 13:09

avatar de usuario
jcrv

Eso es todo lo que necesitas:

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

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

avatar de usuario
RC.

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

Esto supone que sabe que la cadena no está vacía. Si es así, obtendrá un out_of_range excepción.

  • buf[buf.size()-1] = ‘\0’; no elimina nada, solo cambia el carácter que estaba allí para que tenga el valor cero. std:;strings felizmente puede contener dichos caracteres.

    luego

    22 de febrero de 2010 a las 13:18

  • Neil tiene razón. Probablemente debería haber aclarado esto en mi respuesta. La segunda opción cambiará efectivamente el valor del último carácter para que no se imprima, pero la longitud de la cadena seguirá siendo la misma. El uso de borrado en realidad “elimina” el último carácter y cambiará el tamaño de la cadena.

    – RC.

    22 de febrero de 2010 a las 13:43

  • @RC Se imprimirá, suponiendo que use algo como cout << buf. Cómo aparece dependerá de su plataforma. Y siempre puedes aclarar editando tu respuesta.

    luego

    22 de febrero de 2010 a las 20:04

  • lo que es mucho mejor acerca de size() en vez de end() de otra respuesta?

    – ribamar

    8 sep 2017 a las 12:36

avatar de usuario
mkroehnert

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

Referencia: std::string::erase() prototipo 2

no se necesita c ++ 11 o c ++ 0x.

  • buf[buf.size()-1] = ‘\0’; no elimina nada, solo cambia el carácter que estaba allí para que tenga el valor cero. std:;strings felizmente puede contener dichos caracteres.

    luego

    22 de febrero de 2010 a las 13:18

  • Neil tiene razón. Probablemente debería haber aclarado esto en mi respuesta. La segunda opción cambiará efectivamente el valor del último carácter para que no se imprima, pero la longitud de la cadena seguirá siendo la misma. El uso de borrado en realidad “elimina” el último carácter y cambiará el tamaño de la cadena.

    – RC.

    22 de febrero de 2010 a las 13:43

  • @RC Se imprimirá, suponiendo que use algo como cout << buf. Cómo aparece dependerá de su plataforma. Y siempre puedes aclarar editando tu respuesta.

    luego

    22 de febrero de 2010 a las 20:04

  • lo que es mucho mejor acerca de size() en vez de end() de otra respuesta?

    – ribamar

    8 sep 2017 a las 12:36

avatar de usuario
coadicto

int main () {

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

  cout<<str2; // output: 12

  return 0;
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad