/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Como remover espacios en C/C++?

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
t4r0x



Registrado: 14 Jun 2014
Mensajes: 1

MensajePublicado: 14/06/2014 9:31 pm
Título: Como remover espacios en C/C++?

Buenas quiero saber si alguien puede decirme como puedo remover espacios en C/C++ pero preservando los espacios que pueden haber entre patron dado por ejemplo:

tengo esta cadena:

"A BCD EF '12 3 45' GHI'67 890' JK '1' L"

y quiero obtener:
"ABCDEF'12 3 45'GHI'67 890'JK'1'L"

como pueden ver remueve todos los espacios excluyendo los espacios que haya entre ese patron, en este caso serian los apostrofos ( ' ).
normalmente lo hago con remove y erase pero me remueve incluyendo los que hayan entre los apostrofos.
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 143

MensajePublicado: 17/06/2014 1:11 am
Título:

Hola:
Pongo una forma un tanto chapucera por mezclar char y string, aunque lo del string lo hago por comodidad, para no tener que calcular el tamaño del char que se le pasa a la función y simplificar la forma de obtener la cadena resultante, y así centrar el problema en la cuestión de eliminar caracteres de espacio o no según se encuentre un caracter que sirva de indicador.

La idea es simple. Tengo una variable booleana que si está a true (por ejemplo) sólo me pasa a la cadena resultante los caracteres diferentes del espacio, pero si cambia su estado, inserta en la cadena resultante todos los caracteres. Cuando se encuentra con el centinela, cambia el estado.

Y una aproximación a la implementación (mejorable) Wink
Código:
#include <iostream>
#include <string.h>
using namespace std;
string tratar(char* cad);

int main()
{
    char cadena[]="A BCD EF '12 3 45' GHI'67 890' JK '1' L";

    string resultado=tratar(cadena);
    cout<<resultado<<endl;

    return 0;
}

string tratar(char* cad)
{
    string cadena_resultante="";//aqui pasaré la cadena resultante
    bool quitar_espacios=true;
    int i=0;
    while (*(cad+i)!='\0')
    {
        if (quitar_espacios)
        {
            if (*(cad+i)!=' ') //solo paso a la cadena resultante los caracteres que no sean espacio
            {
                cadena_resultante+=*(cad+i); //forma facilona de incorporar los caracteres al string.
                if (*(cad+i)==39) //el caracter apóstrofe,no sabía como ponerlo entre comillas
                {
                    quitar_espacios=!quitar_espacios;
                }
            }
        }
        else //si quitar_espacios == false incorporo todos los caracteres, sin quitar los espacios
        {
            cadena_resultante+=*(cad+i);
            if (*(cad+i)==39)
                {
                    quitar_espacios=!quitar_espacios;
                }
        }
        i++;
    }
    return cadena_resultante;
}


Saludos!
_________________
Aprendiendo
Volver arriba
_Leo_



Registrado: 20 Oct 2005
Mensajes: 399
Ubicación: Buenos Aires, Argentina

MensajePublicado: 22/06/2014 7:59 am
Título:

Con una variable de control que cambie con cada comilla simple, se puede resolver:

Código:
#include <stdio.h>
#include <string.h>


int main(int argc, char ** argv)
{
  const char * cadena = "A BCD EF '12 3 45' GHI'67 890' JK '1' L";
  char result[50];
  int quoted = 0, i = 0;

  // Recorro cadena
  while(*cadena) {
    if (*cadena == '\'') {
      quoted = !quoted; // Invierto estado
      result[i++] = *cadena;
    }
    else {
      // En función del estado, salto los espacios
      if (quoted)
        result[i++] = *cadena;
      else {
        if (*cadena != ' ')
          result[i++] = *cadena;
      }
    }
    ++cadena;
  }

  printf("Resultado: %s\n", result);

  return 0;
}


Cuidado: este código pierde el puntero cadena porque lo usa para avanzar sobre la memoria. Se puede salvar copiando en un puntero extra.
_________________
_Leo_
Daphne - administrador de tareas
Cine, tecnología, sociedad
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com