Pracuję nad książką R K &. Czytałem dalej od moich ćwiczeń, głównie z braku czasu. Nadrabiam zaległości i wykonałem prawie wszystkie ćwiczenia z rozdziału 1, który jest tutorialem.Ćwiczenie K & R: Mój kod działa, ale czuje się śmierdzący; Porady dotyczące czyszczenia?
Moim problemem było ćwiczenie 1-18. Ćwiczenie ma na celu:
Napisz program do usuwania spacjami i kart z linii wejściowych i usunąć całkowicie puste wiersze
Mój kod (poniżej) robi, i działa. Moim problemem jest zastosowana metoda przycinania. Czuje się ... źle ... jakoś. Podobnie jak gdybym zobaczył podobny kod w C# w przeglądzie kodu, prawdopodobnie zwariowałbym. (C# jest jedną z moich specjalności.)
Czy ktoś może zaoferować porady dotyczące czyszczenia tego - z haczykiem, który powiedział, doradztwo musi używać tylko wiedzy z rozdziału 1 K & R. (Wiem, że istnieje milion sposoby czyszczenia tego przy użyciu pełnej biblioteki C, mówimy tylko o rozdziale 1 i podstawowym stdio.h tutaj.) Ponadto, udzielając porady, czy możesz wyjaśnić, dlaczego to pomoże? (Ja, mimo wszystko, starając się uczyć i kto lepiej niż uczyć się od ekspertów tutaj!)
#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: Doceniam wszystkie przydatne wskazówki widzę tutaj. Chciałbym przypomnieć ludziom, że wciąż jestem n00b z C, a konkretnie jeszcze nie doszedłem do wskaźników. (Pamiętaj, że nieco o Ch.1 z K & R - Ch.1 nie robi wskaźników.) Ja "trochę" dostaję niektóre z tych rozwiązań, ale wciąż są one dotknięte zaawansowaniem dla tego, gdzie jestem ..
I większość tego, czego szukam, to sama metoda przycinania - konkretnie fakt, że przepuszczam przez pętlę razy (co jest tak brudne). Czuję, że gdybym był tylko bardziej sprytny (nawet bez zaawansowanej znajomości C), mogło to być czystsze.
nie można znaleźć żadnego problemu tutaj ... – Ilya
Jest to oczywiście prawie 7 lat późno, więc niekoniecznie dla ciebie, ale raczej dla tych, którzy podążają - w tym przypadku K & R może być interpretowane jako oznaczające linie, które zawierają tylko "" "znaki, gdy mówią" usuń całkowicie puste linie "ponieważ pętla while w funkcji głównej zostanie zakończona, jeśli' getline' zwróci długość zero (tj. linię z dosłownie żadnymi znakami). Odnośnik: kod znajduje się na stronie 29. – chucksmash