Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/01/2007, 18:09
PCKing
 
Fecha de Ingreso: febrero-2006
Mensajes: 49
Antigüedad: 19 años
Puntos: 1
Borrar espacios sobrantes

Buenos dias muchachos...

Estuve navegando el subforo de programacion y realmente me parece muy buena la ayuda que dan

Estoy aprendiendo C desde hace poco y estuve haciendo un programita que borra los espacios de mas en las lineas ingresadas por el usuario.

El código es el siguiente

Código:
#include <stdio.h>

#define MAXLINE 1000

int getline(char s[], int lim);      /* Prototipo de la funcion getline */
void blanks(char s[]);               /* Prototipo de la función blanks */

/*
      main: Borra los espacios de mas en todas las lineas que ingrese el usuario
            hasta que se pulse CTRL+C
*/

int main(void)
{
      int size;
      char string[MAXLINE];
      
      size = getline(string, MAXLINE);
      
      while (size != MAXLINE)
      {
            blanks(string);
            printf("%s", string);
      
            size = getline(string, MAXLINE);
      }
      
      return 0;
}

/* 
   getline: Recibe una linea de texto ingresada por el usuario. 
   
   Devuelve su longitud
*/

int getline(char s[], int lim)
{
    int i, c;
    
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++)
        s[i] = c;
    
    if (i == 0 && c == EOF)
       i = MAXLINE;
    
    if (c == '\n')
    {
          s[i] = '\n';
          i++;
    }
    
    s[i] = '\0';

    return i;
}

/*
    blanks: Borra los espacios que esten de mas en una linea
    
    Ejemplos:
             Entrada: '   Hola  '
             Salida:  'Hola'
             
             Entrada: ' Hola  que   tal'
             Salida:  'Hola que tal'
*/

void blanks(char s[])
{
     int i = 0;
     int b;
     
     while (s[i] != '\0')
     {
           if (s[0] == ' ' || (s[i] == ' ' && s[i+1] == ' '))   
           {
              b = i;
              
              while (s[i] != '\0')
              {
                 s[i] = s[i+1];
                 i++;                                         
              }
              
              i = b;
           }   
           else
               i++;
     }
}
El programita funciona bien, pero en mi opinion la función blanks es un poco ineficiente y podria mejorarse. Un amigo me sugirió una de este estilo

Código:
void blanks(char s[])
{
	int r=0;	//read index
	int w=0;	//write index

	while(s[r] != '\0')
	{
		while(s[r] == ' ' && s[r+1] == ' ')
                          r++;	
                s[w]=s[r];				
		r++;
		w++;
	}
	s[w]='\0';
}
Es mas eficiente el algoritmo, pero aún así falla cuando se agregan espacios al principio, podria poner un while al final y mover todo el vector a la izquierda solucionando fácilmente el problema, pero quería saber si a ustedes se les ocurría una solucion mejor.

Estoy abierto a cualquier crítica o sugerencia sobre el estilo de programacion y la calidad del algoritmo

Un saludo y gracias por adelantado