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.
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;
}
}
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:
#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:
#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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
excelente leosansan ;D
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++:
#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;
}
Que todo sea por una línea menos ;) :
#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! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)