Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   C/C++ (http://www.forosdelweb.com/f96/)
-   -   Borrar espacios sobrantes (http://www.forosdelweb.com/f96/borrar-espacios-sobrantes-454751/)

PCKing 07/01/2007 18:09

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

:adios:

MaxExtreme 08/01/2007 09:19

Re: Borrar espacios sobrantes
 
Cita:

Iniciado por PCKing (Mensaje 1844912)
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.

fightmx 08/01/2007 11:15

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.

PCKing 08/01/2007 16:50

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

_Lucifer_ 09/01/2007 16:36

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

fightmx 09/01/2007 19:09

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.

PCKing 10/01/2007 00:06

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

:adios:

_Lucifer_ 10/01/2007 04:09

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 :si: ...jejejeje...

Saludos

fightmx 10/01/2007 06:44

Re: Borrar espacios sobrantes
 
Cita:

Tranquilo, todos estamos aqui para aprender ...jejejeje...
Totalmente de acuerdo :arriba:.

PCKing 11/01/2007 03:20

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

_Lucifer_ 11/01/2007 06:11

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


La zona horaria es GMT -6. Ahora son las 06:25.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.