_____________________________________________________________________________________
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; } } }
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..
ResponderEliminar#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;
}
}
}
¡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.
EliminarSaludos.
¡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.
ResponderEliminarHola, 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)
ResponderEliminarCon 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.
Ha y lo de la violacion de segmento no sera porque superaste el tamaño del arreglo?
EliminarHola. 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.
EliminarNo 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í
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..
ResponderEliminary 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..
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.
Eliminarintento entenderlo pero no puedo con el
ResponderEliminarvoid 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;
}
}
}