C/Visual C - Como puedo quitar caracteres blancos duplicados

   
Vista:

Como puedo quitar caracteres blancos duplicados

Publicado por César (1 intervención) el 13/03/2010 10:07:49
Hola buenos días:

En principio, me gustaría aclarar que no quiero que me resolvais el problema, sino más bien que me orienteis un poco, ya que llevo demasiado tiempo dándole vueltas al mismo, y creo que no puede ser tan complicado. El problema es el siguiente:

Necesito crear un programa usando getchar() para la entrada y putchar() para la salida, que me lea una cadena y cuando introduzca caracteres en blanco duplicados me los deje como blancos simples, creo que me he explicado correctamente. Os mando el código con comentarios que he sacado, pero que me da una salida extraña, seguro que es una tontería, pero agradecería un poco de orientación.

#include <stdio.h>

main(){
int c;
int blancos;

blancos = -1; //Variable auxiliar para los blancos

while((c = getchar()) != EOF){ //Leemos caracter a caracter hasta el EOF
putchar(c); //Sacaremos a pantalla al pulsar Intro
if(c == ' '){ //Si el caracter introducido es un espacio en blanco
blancos++; //Actualizamos los blancos
while(blancos == 0){ //Mientras sigamos introduciendo blancos
putchar('\b'); //Borramos el carácter blanco introducido
}
}else{
blancos = -1; //Reiniciamos variable auxiliar siempre cuando el carácter no sea un blanco
}
}
return 0;
}

P.D: Sé que este programa se puede hacer con funciones como strchr, etc, pero como habreis notado no es mi intención utilizar este tipo de funciones, es por un tema de aprendizaje. También habreis notado que es estándar puro y duro, y por lo tanto, no depende del S.O. En este caso, es bajo linux, pero estoy segurísimo, que debería funcionar bajo cualquier plataforma y S.O.

Esperando vuestra ayuda, me despido atentamente y os doy las gracias.

Un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Como puedo quitar caracteres blancos duplicados

Publicado por eduardo (82 intervenciones) el 20/03/2010 17:18:40
Hola, hace un tiempo hice un programa que me permitía eliminar los caracteres de espaciado que separan 2 palabra cuando tienen más de uno ó tambien aquellos que se encuentran al inicio o final de la frase. El programa lo hice bajo window, para linux solo es cuestión de cambiar unas cuantas instrucciones por ejemplo sustituir el:
system( "cls" );
por
system( "clear" );

Tambien sé que fflush() no funciona de igual manera en Win que en Linux, en todo lo averiguas pero el algorito me funciona bien.
Salu2.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define LONG 80

/* prototipo */
char *corregirEspaciado( char s[] );

/* la función main comienza la ejecución del programa */
int main( void )
{
char cad[LONG + 1];
int continuar = ' '; /* bandera de continuación */

/* ciclo de control del programa */
while( continuar != 'N' && continuar != 'n' ) {
system( "cls" );
cad[0] = '\0';
// system( "clear" ); en linux
printf( "\n CORREGIR ESPACIADO( Version 1 ): "
"\n ================== \n\n" );

printf( " Este programa corrige los caracteres de espaciado que separan las palabras de\n"
" una oracion. Para probarlo ingrese una cadena donde cada palabra este separada\n"
" de la otra por mas de 2 espacios blancos o tambien por unos o mas tabuladores.\n\n\n" );

/* ciclo para controlar la cadena vacía */
do {
printf( " Cadena: " );
fflush( stdin );
gets( cad );

if ( !cad[0] ) printf( "\t Cadena vacia, intente otra vez\n\n" );

} while ( !cad[0] );

printf( "\n Cadena: %s", corregirEspaciado(cad) );

printf( "\n\n\n\t\t Desea continuar S/N?: " );
continuar = getchar();
}

return 0; /* indicar terminación exitosa */

} /* fin de main */

/* IMPLEMENTACIÓN DE FUNCIÓNES */

char *corregirEspaciado( char s[] )
{
register int i, j;
char *trim( char s[] ); /* prototipo */

/* eliminar blancos y tabuladores al final */
trim( s );

/* encontrar el inicio de la cadena */
for ( i = 0; isspace( s[i] ); i++ );

for ( j = 0; s[i]; ) {
while ( !isspace( s[i] ) && s[i] )
s[j++] = s[i++];
while ( isspace ( s[i] ) && s[i] )
i++; /* encontrar el siguiente caracter */

if ( s[i] )
s[j++] = ' ';
}
s[j] = '\0';

return s;
}

/* trim: elimina blancos, tabuladores al final de la cadena */
char *trim( char s[] )
{
register int n;

for ( n = strlen(s) - 1; n >= 0; n-- )
if ( s[n] != ' ' && s[n] != '\t' ) break;

s[n + 1] = '\0';

return s;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar