Estoy trabajando en el libro K & R. He leído más adelante que los ejercicios, principalmente por falta de tiempo. Me pongo al día y he hecho casi todos los ejercicios del capítulo 1, que es el tutorial.Ejercicio K & R: Mi código funciona, pero se siente mal olor; Consejos para la limpieza?
Mi problema fue el ejercicio 1-18. El ejercicio consiste en:
escribir un programa para eliminar los blancos de cola y pestañas de línea de entrada, y para eliminar por completo las líneas en blanco
Mi código (abajo) hace eso, y trabaja. Mi problema con esto es el método de recorte que implementé. Se siente ... mal ... de alguna manera. Al igual que si vi un código similar en C# en una revisión del código, probablemente me volvería loco. (C# es una de mis especialidades)
¿Alguien puede ofrecer algún consejo sobre cómo limpiar esto? Con la excusa de que dicho consejo tiene que usar únicamente el conocimiento del Capítulo 1 de K & R. (Sé que hay un trillón Maneras de limpiar esto usando la biblioteca completa de C, solo estamos hablando del Capítulo 1 y la stdio.h básica aquí. También, al dar el consejo, ¿puedes explicar por qué te ayudará? (Estoy, después de todo, tratando de aprender Y quién mejor para aprender de que los expertos aquí!?)
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int max);
void trim(char line[], char ret[]);
int main()
{
char line[MAXLINE];
char out[MAXLINE];
int length;
while ((length = getline(line, MAXLINE)) > 0)
{
trim(line, out);
printf("%s", out);
}
return 0;
}
int getline(char line[], int max)
{
int c, i;
for (i = 0; i < max - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
line[i] = c;
if (c == '\n')
{
line[i] = c;
++i;
}
line[i] = '\0';
return i;
}
void trim(char line[], char ret[])
{
int i = 0;
while ((ret[i] = line[i]) != '\0')
++i;
if (i == 1)
{
// Special case to remove entirely blank line
ret[0] = '\0';
return;
}
for ( ; i >= 0; --i)
{
if (ret[i] == ' ' || ret[i] == '\t')
ret[i] = '\0';
else if (ret[i] != '\0' && ret[i] != '\r' && ret[i] != '\n')
break;
}
for (i = 0; i < MAXLINE; ++i)
{
if (ret[i] == '\n')
{
break;
}
else if (ret[i] == '\0')
{
ret[i] = '\n';
ret[i + 1] = '\0';
break;
}
}
}
EDIT: Agradezco todos los consejos útiles que estoy viendo aquí. Me gustaría recordar a la gente que todavía soy un n00b con C, y específicamente aún no he llegado a los punteros. (Recuerde la información sobre el capítulo 1 de K & R - Ch.1 no hace punteros.) "Recibo un poco" algunas de esas soluciones, pero todavía están un poco avanzadas para saber dónde estoy. .
Y la mayor parte de lo que estoy buscando es el propio método de ajuste, específicamente el hecho de que estoy recorriendo veces (lo cual se siente tan sucio). Siento que si fuera solo un toque más inteligente (incluso sin el conocimiento avanzado de C), esto podría haber sido más limpio.
, no encontramos un problema aquí ... – Ilya
Obviamente, es casi 7 años tarde, por lo que no necesariamente para usted, sino para los que siguen. En este caso, K & R podría interpretarse como líneas que contienen solo caracteres '' ''cuando dicen" eliminar líneas completamente en blanco " "dado que el ciclo while en la función principal saldrá si' getline' devuelve una longitud de cero (es decir, una línea que literalmente carece de caracteres). Referencia: la lista del código en la página 29. – chucksmash