Como remover espacios en C/C++?

Iniciado por t4r0x, 15 Junio 2014, 07:06 AM

0 Miembros y 1 Visitante están viendo este tema.

t4r0x

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.

daryo

#1
funciona asi: antes de encontrar el apostrofe copia todo excepto los espacios cuando encuentra un apostrofe token cambia a 1 y por tanto copiara todo incluyendo espacios cuando vuelve a encontrar un apostrofe token cambia a cero y de nuevo deja de copiar espacios
#include <stdio.h>
#include <stdlib.h>

int main()
{
   int posicion;
   int token=0;
   int contador=0;
   char cadena[]="A BCD EF '12 3 45' GHI'67   890' JK      '1' L";
   char resultado[2045];
   for(posicion=0;posicion<sizeof(cadena);posicion++)
   {
       if(cadena[posicion]!=' ' && token==0)
       {
       resultado[contador]=cadena[posicion];
       contador++;
       }

       if(token==1)
       {
       resultado[contador]=cadena[posicion];
       contador++;
       }
       if(cadena[posicion]=='\'')
       {
        if(token==0)
        {
        token=1;
        }
        else
        {
        token=0;
        }
       }

   }
   printf("%s",resultado);
   return 0;
}

}
buenas

leosansan

#2
Con una idea parecida a daryo solo que desplazo los caracteres de la cadena a la izquierda cada vez que encuentro un espacio fuera de los delimitadores:

Código (cpp) [Seleccionar]
#include <stdio.h>

void eliminar ( char cadena[], int pos ){
 int i;
 for ( i = pos; cadena[i]; i++ )
   cadena[i] = cadena[i+1];
}

int main(void){
 int i, flag=0;
 char cadena[] = "A  BCD   EF 9'12  3 45'   G  H  I  '67   890'  J  K  MN   '1'   L  9  ";
 for ( i = 0; cadena[i] ; i++ ){
   if ( cadena[i] == '\'' )
     flag = ( flag ==1 ) ? 0 : 1;
   else if ( flag == 0 && cadena[i] == ' ' )
     eliminar ( cadena, i-- );
 }
 printf ( "\n%s\n", cadena );
 return 0;
}


Y con la misma idea, pero un poco más cpmprimido:

Código (cpp) [Seleccionar]
#include <stdio.h>

int main(void){
  int i, flag=0, j = 0;
  char cadena[] = "A  BCD   EF 9'12  3 45'   G  H  I  '67   890'  J  K  MN   '1'   L  9  ";
  char cadena_final[sizeof(cadena)] = {0};
  for ( i = 0; cadena[i]; i++ ){
    if ( cadena[i] == '\'' )
      flag = ( flag ==1 ) ? 0 : 1;
    if ( (flag == 0 &&  cadena[i] != ' ')  || flag == 1 )
      cadena_final[j++] = cadena[i];
  }
  printf ( "\n%s\n", cadena_final );
  return 0;
}


¡¡¡¡ Saluditos! ..... !!!!



daryo

buenas

eferion

#4
Mi propuesta en C:


#include <stdio.h>

int main( void )
{
 int i, j;
 int flag = 0;
 char cadena[] = "A  BCD   EF 9'12  3 45'   G  H  I  '67   890'  J  K  MN   '1'   L  9  ";
 char cadena_final[ sizeof( cadena ) ] = {0};

 for ( i = 0, j = 0; cadena[i]; i++ )
 {
   flag ^= ( cadena[ i ] == '\'' );

   if ( flag  || cadena[ i ] != ' ' )
     cadena_final[ j++ ] = cadena[ i ];
 }
 printf ( "\n%s\n", cadena_final );
 return 0;
}


Mi propuesta en C++:

Código (cpp) [Seleccionar]

#include <string>
#include <iostream>

int main( )
{
 std::string cadena = "A  BCD   EF 9'12  3 45'   G  H  I  '67   890'  J  K  MN   '1'   L  9  ";
 std::string cadena_final;

 bool flag = false;
 for ( auto it = cadena.begin( ); it != cadena.end( ); ++it )
 {
    flag ^= ( *it == '\'' );

   if ( flag || *it != ' ' )
     cadena_final += *it;
 }

 std::cout << std::endl << cadena_final << std::endl;
}

leosansan

#5
Que todo sea por una línea menos  ;) :

Código (cpp) [Seleccionar]
#include <stdio.h>

int main(void){
 int i, k, flag = 0, j = 0;
 char cadena[] = "A  BCD   EF 9'12  3 45'   G  H  I  '67   890'  J  K  MN   '1'   L  9  ";
 char cadena_final[sizeof(cadena)] = {0};
 for ( i = 0; cadena[i]; i++ ){
   flag = ( cadena[i] == '\'' ) ? 1 - flag : 0 + flag;
   if ( ( cadena[i] != ' ')  || flag == 1 )
     cadena_final[j++] = cadena[i];
 }
 printf ( "\n%s\n", cadena_final );
 return 0;
}


¡¡¡¡ Saluditos! ..... !!!!