martes, 4 de enero de 2011

Kernighan_Ritchie_1.18 (Eliminar espacios y tabuladores al final de una línea)

1.18 Escriba un programa que elimine los blancos y los tabuladores que estén al final de cada línea de entrada, y que borre completamente las líneas en blanco.
_____________________________________________________________________________________
Solución:
Éste código es debido a Roberto, el cual lo ha puesto en ésta entrada como comentario.

#include <stdio.h>
//---------------------------------------------------------------//
// Borra espacios y tabuladores que esten al final de una linea. //
//---------------------------------------------------------------//
#define max 2000

void imprime(char lineas[],int caracteres);

int main(void)
{
int a,i=0;
char linea[max]={0,0};
//-------------------------------------------------------------------------------------------------//
printf("Este programa borra los espacios y tabuladores que esten al final de una linea.\n");
printf("También borra las líneas en blanco.\n\n");
//-------------------------------------------------------------------------------------------------//
while((a=getchar())!=EOF){
linea[i]=a;
i++;
}
imprime(linea,i);
return 0;
}

void imprime(char lineas[],int caracteres){
int i=0,k=0,l=0,j=0,m=0,z=0,b=0;
char imprimir[max]={0,0,0};
//-------------------------------------------//
for(i=0,j=1;i<=caracteres-1;i++,j++){
if(lineas[i]=='\n'){
for(l=0,z=1;z<=j;l++,m++,z++){
imprimir[l]=lineas[m];
}
imprimir[l]='\0';
b=0;
for(k=j-2;k>=0 && (imprimir[k]==' ' || imprimir[k]=='\t');k--){
imprimir[k]='\0';
b++;
}
if(b==1)
printf("%s \n",imprimir);
else if(k>=0){
k++;
imprimir[k]='\n';
printf("%s",imprimir);
}
j=z=0;
}
}
}

Una ejecución del programa, con su propio código fuente como entrada es la siguiente:

Este programa borra los espacios y tabuladores que esten al final de una linea.
También borra las líneas en blanco.

#include <stdio.h>
//---------------------------------------------------------------//
// Borra espacios y tabuladores que esten al final de una linea. //
//---------------------------------------------------------------//
#define max 3000
void imprime(char lineas[],int caracteres);
int main(void)
{
int a,i=0;
char linea[max]={0,0};
//-------------------------------------------------------------------------------------------------//
printf("Este programa borra los espacios y tabuladores que esten al final de una linea.\n");
printf("También borra las líneas en blanco.\n\n");
//-------------------------------------------------------------------------------------------------//
while((a=getchar())!=EOF){
linea[i]=a;
i++;
}
imprime(linea,i);
return 0;
}
void imprime(char lineas[],int caracteres){
int i=0,k=0,l=0,j=0,m=0,z=0,b=0;
char imprimir[max]={0,0,0};
//-------------------------------------------//
for(i=0,j=1;i<=caracteres-1;i++,j++){
if(lineas[i]=='\n'){
for(l=0,z=1;z<=j;l++,m++,z++){
imprimir[l]=lineas[m];
}
imprimir[l]='\0';
b=0;
for(k=j-2;k>=0 && (imprimir[k]==' ' || imprimir[k]=='\t');k--){
imprimir[k]='\0';
b++;
}
if(b==1)
printf("%s \n",imprimir);
else if(k>=0){
k++;
imprimir[k]='\n';
printf("%s",imprimir);
}
j=z=0;
}
}
}

9 comentarios:

  1. Hola, como andas? Disculpa pero este codigo no me funciono.. Te dejo el que escrbi yo, borra los ultimos espacios o tabuladores y borra las lineas en blanco, creo que exagere con la cantidad de contadores, pero bueno eso es para rever mas adelante.. Saludos..

    #include
    //---------------------------------------------------------------//
    // Borra espacios y tabuladores que esten al final de una linea. //
    //---------------------------------------------------------------//
    #define max 1000

    void imprime(char lineas[],int caracteres);

    int main(void)
    {
    int a,i=0;
    char linea[max]={0,0};
    //-------------------------------------------------------------------------------------------------//
    printf("Este programa borra los espacios y tabuladores que esten al final de una linea.\n\n");
    //-------------------------------------------------------------------------------------------------//
    while((a=getchar())!=EOF){
    linea[i]=a;
    i++;
    }
    imprime(linea,i);
    return 0;
    }

    void imprime(char lineas[],int caracteres){
    int i=0,k=0,l=0,j=0,m=0,z=0,b=0;
    char imprimir[max]={0,0,0};
    //-------------------------------------------//
    for(i=0,j=1;i<=caracteres-1;i++,j++){
    if(lineas[i]=='\n'){
    for(l=0,z=1;z<=j;l++,m++,z++){
    imprimir[l]=lineas[m];
    }
    imprimir[l]='\0';
    b=0;
    for(k=j-2;k>=0 && (imprimir[k]==' ' || imprimir[k]=='\t');k--){
    imprimir[k]='\0';
    b++;
    }
    if(b==1)
    printf("%s \n",imprimir);
    else if(k>=0){
    k++;
    imprimir[k]='\n';
    printf("%s",imprimir);
    }
    j=z=0;
    }
    }
    }

    ResponderEliminar
    Respuestas
    1. ¡Hola, de nuevo! Acabo de copiar tu código en la entrada. Se compila bien, sin embargo, a la hora de ejecutarlo con su propio código como entrada, me envía una violación de segmento. Supongo que tú tendrás el mismo problema. Me gustaría que me dijeras si ya lo has modificado.
      Saludos.

      Eliminar
  2. ¡Hola, Roberto! La verdad que qué te puedo decir. Muchas gracias. Éste programa ya lo había checado. Es cierto. No corre y lo había dejado ahí. Tengo muchas cosas qué corregir. Gracias de nuevo y saludos. Veo que te decidiste a programar en serio con el libro.

    ResponderEliminar
  3. Hola, gracias, si tengo ganas de aprender a programar y lo estoy haciendo por mi cuenta con este libro e internet..(Por ahi mas adelante me compro el de Deitel y Deitel que lo recomiendan mucho)
    Con respecto al codigo, el tema de que lo ejecutas con su propio codigo como entrada sinceramente no se a que te referis con eso, no lo se hacer, si me podrias explicar como hacerlo te lo agradeceria.. uso el CodeBlock.
    Saludos.

    ResponderEliminar
    Respuestas
    1. Ha y lo de la violacion de segmento no sera porque superaste el tamaño del arreglo?

      Eliminar
    2. Hola. Los Deitel son muy buenos, pero si terminas con el Kernighan te van a parecer muy fáciles. Yo también tengo varios programas aquí de esos libros.
      No creo que se haya superado el tamaño del arreglo, porque consideraste un arreglo de 1000 entradas. Con respecto a cómo hacer para que el programa reciba su propio código como entrada, no sé como se logra en CodeBlocks, porque yo no lo uso. Pero te explico cómo en GNU-Linux o Unix:
      En una consola (línea de comandos) escribes

      $ cc MiPrograma.c

      y si no hay problemas, no pasa nada. Sólo se genera el ejecutable con el nombre de a.out
      Para ejecutarlo, pones en la misma consola

      $ ./a.out

      y con eso se corre el programa.
      Si el programa requiere una entrada de datos, como en éste caso, puedes hacerlo desde el teclado o desde un archivo. Si es desde el teclado sólo lo escribes y ya; si es desde un archivo, entonces, si el archivo está en el mismo directorio en el que estás trabajando, usas <

      $ ./a.out < Archivo.txt

      El símbolo < es parte de las utilerías de los sistemas Unix, e indica que lo que está a la derecha se utiliza como entrada para lo que está a la izquierda. La extensión es indistinta. Como casi siempre son textos planos, uso .txt, pero en el caso del código fuente, usas el .c
      Espero te sirva de algo la explicación. También puedes redireccionar la salida con >, como se muestra en Aquí

      Eliminar
  4. Copie el codigo al Openoffice y dice que hay 1455 caracteres.. proba cambiando el tamaño del arreglo a 2000 para ver si sigue haciendo lo mismo..
    y lo de usar el propio codigo para la entrada capas lo que tenga que hacer es desde el propio codigo leer un archivo, no se como todabia, pero se que se puede hacer..

    ResponderEliminar
    Respuestas
    1. Efectivamente, se trataba de que el tamaño del arreglo era menor que el de los caracteres del archivo. Ya lo pude ejecutar bien. Con respecto a abrir un archivo desde el programa, es cierto. Se puede hacer, aunque sólo sé de la forma para Unix, que viene en el mismo libro de Kernighan-Ritchie.

      Eliminar
  5. intento entenderlo pero no puedo con el

    void imprime(char lineas[],int caracteres){
    int i=0,k=0,l=0,j=0,m=0,z=0,b=0;
    char imprimir[max]={0,0,0};
    //-------------------------------------------//
    for(i=0,j=1;i<=caracteres-1;i++,j++){
    if(lineas[i]=='\n'){
    for(l=0,z=1;z<=j;l++,m++,z++){
    imprimir[l]=lineas[m];
    }
    imprimir[l]='\0';
    b=0;
    for(k=j-2;k>=0 && (imprimir[k]==' ' || imprimir[k]=='\t');k--){
    imprimir[k]='\0';
    b++;
    }
    if(b==1)
    printf("%s \n",imprimir);
    else if(k>=0){
    k++;
    imprimir[k]='\n';
    printf("%s",imprimir);
    }
    j=z=0;
    }
    }
    }

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...