Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Borrar espacios sobrantes

Estas en el tema de Borrar espacios sobrantes en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 07/01/2007, 18:09
 
Fecha de Ingreso: febrero-2006
Mensajes: 49
Antigüedad: 18 años, 2 meses
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

  #2 (permalink)  
Antiguo 08/01/2007, 09:19
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Re: Borrar espacios sobrantes

Cita:
Iniciado por PCKing Ver Mensaje
Buenos dias muchachos...

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

Cita:
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

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
Para algorritmos, usa algún profiler y sabrás a ciencia cierta qué es mejor; pero no descuides la seguridad, esas funciones son de las más delicadas. Tienes libros también dedicados a ello.

Sobre el código, el estilo es bueno y se lee claro. Lo único, que pases punteros junto con un tamaño, en vez de arrays; porque sino podrás usar memoria dinámica con esas funciones.
  #3 (permalink)  
Antiguo 08/01/2007, 11:15
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 meses
Puntos: 22
Re: Borrar espacios sobrantes

Hola PcKing.

Mira, para este caso basta con un solo while y los dos índices por ejemplo i,j.
La idea principal es copiar en cada iteración el caracter de la posición j a la posición i e incrementar el índice j de tal forma que cuando el caracter copiado es '\0' salimos del bucle. A su vez en cada iteración si el caracter copiado no es un espacio en blanco entonces incrementamos i para copiar el siguiente caracter, pero si fuera un espacio en blanco entonces se sobreescribe por el caracter copiado en la siguiente iteración.

Ejemplo:
Código:
void blanks(char* str)
{
     int i = 0;
     int j = 0;
     
     while((*(str + i) = *(str + j++)) != '\0')
        if((*(str + i)) != ' ')
         i++;
}
Con esto solo trato de ejemplificar como puedes reducir a un solo while tu función, la implementación final que hagas pues ya te corresponde(toma en cuenta las consideraciones de MaxExtreme).

Saludos.
  #4 (permalink)  
Antiguo 08/01/2007, 16:50
 
Fecha de Ingreso: febrero-2006
Mensajes: 49
Antigüedad: 18 años, 2 meses
Puntos: 1
Re: Borrar espacios sobrantes

Buenas

Les agradezco a ambos los consejos. Voy a tratar de mejorar el código siguiendo sus recomendaciones, aunque como hace poco comencé a programar en C todavía no domino bien los punteros; pero me voy a poner a estudiarlos en estos dias

Saludos y gracias nuevamente
  #5 (permalink)  
Antiguo 09/01/2007, 16:36
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Borrar espacios sobrantes

Hola fightmx el codigo esta bastante bueno pero no cumple con las especificaciones del problema planteado por PCKing, si te das cuenta en el ejemplo que tiene en su codigo dice:
Cita:
/*
blanks: Borra los espacios que esten de mas en una linea

Ejemplos:
Entrada: ' Hola '
Salida: 'Hola'

Entrada: ' Hola que tal'
Salida: 'Hola que tal'
*/
Sin embargo el codigo que posteaste borra TODOS los espacios y no los que estan de mas. Es decir que para el ejemplo:
' Hola que tal'
la salida de tu codigo es:
'Holaquetal'
y no:
' Hola que tal'

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #6 (permalink)  
Antiguo 09/01/2007, 19:09
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 meses
Puntos: 22
Re: Borrar espacios sobrantes

Es verdad _Lucifer_ pequeño detalle...jeje

variante:
Código:
void blanks(char* str)
{
     int i = 0;
     int j = 0;
     
     while((*(str + i) = *(str + j++)) != '\0')
        if((*(str + i)) != ' ' || (*(str + j)) != ' ' && i > 0)
         i++;
}
Saludos.
  #7 (permalink)  
Antiguo 10/01/2007, 00:06
 
Fecha de Ingreso: febrero-2006
Mensajes: 49
Antigüedad: 18 años, 2 meses
Puntos: 1
Re: Borrar espacios sobrantes

Buenos dias,

Cita:
Iniciado por _Lucifer_
Sin embargo el codigo que posteaste borra TODOS los espacios y no los que estan de mas. Es decir que para el ejemplo:
' Hola que tal'
la salida de tu codigo es:
'Holaquetal'
y no:
' Hola que tal'
Yo compilé y ejecuté el programa y funciona perfectamente

Si queres te pego una captura de pantalla durante la ejecución...

Ademas el while de la funcion pregunta si hay dos espacios seguidos, para correr el vector un solo lugar a la izquierda, asi que un espacio va a quedar seguro

  #8 (permalink)  
Antiguo 10/01/2007, 04:09
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Borrar espacios sobrantes

Cita:
Yo compilé y ejecuté el programa y funciona perfectamente
¿Cual?

El comentario que hice era con respecto a primer prigrama posteado por fightmx, pero imagino que con la correccion que le hizo debe ser suficiente...

Si hablas del que posteaste tu entonces hay una confusion, porque ese esta bueno.

Cita:
Es verdad _Lucifer_ pequeño detalle...jeje
Tranquilo, todos estamos aqui para aprender ...jejejeje...

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #9 (permalink)  
Antiguo 10/01/2007, 06:44
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 2 meses
Puntos: 22
Re: Borrar espacios sobrantes

Cita:
Tranquilo, todos estamos aqui para aprender ...jejejeje...
Totalmente de acuerdo .
  #10 (permalink)  
Antiguo 11/01/2007, 03:20
 
Fecha de Ingreso: febrero-2006
Mensajes: 49
Antigüedad: 18 años, 2 meses
Puntos: 1
Re: Borrar espacios sobrantes

Buenas

Cita:
Iniciado por _Lucifer_
Si hablas del que posteaste tu entonces hay una confusion, porque ese esta bueno.
Si, crei que decías del mio. Te pido disculpas por la confusión...

Saludos
  #11 (permalink)  
Antiguo 11/01/2007, 06:11
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 17 años, 11 meses
Puntos: 28
Re: Borrar espacios sobrantes

Todos estamos para aprender, si le le pasa un detalle a alguien siempre habra otro forista que lo pilla (me ha pasado varias veces)...

De eso se tratan los foros, ¿no? Como me dijo un prof hace años "El conocimiento es universal, es como la energia, hay que dejarlo fluir para que regrese a ti con mayor intensidad"

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:43.