Jestem nowy w programowaniu, zaczynając od Objective-C, ale zdecydowałem się wrócić do podstaw, zanim przejdę dalej. Spędzam trochę czasu w C i zmagam się z pomyłką wskaźnika. Moje pytanie dotyczy tego, w jaki sposób K & R mówi, że zaimplementowano fgets (p165, wydanie drugie). Poniższy kod jest bezpośrednio z tekstu z kilkoma moimi komentarzami.Implementacja fgets (K & R)
char* fgets(char* s, int n, FILE *iop)
{
register int c;
register char* cs;
cs = s;
while(--n > 0 && (c = getc(iop)) != EOF)
{
// put the input char into the current pointer position, then increment it
// if a newline entered, break
if((*cs++ = c) == '\n')
break;
}
*cs = '\0';
return (c == EOF && cs == s) ? NULL : s;
}
1) Przekazujemy znak * do funkcji fgets, w której lokalizacji przechowujemy dane użytkownika. Dlaczego trzeba zadeklarować lokalny char * cs - a następnie zainicjować go na s? Dlaczego nie możemy bezpośrednio manipulować/dodawać do s w instrukcji if? Widząc, że cs jest inicjowane do punktu s, nie dodaje znaków do cs dokładnie to samo?
2) Związane z powyższym ... Po powrocie funkcji, test jest sprawdzany, czy cs == s. Dlaczego jest to konieczne?
Myślę, że być może brakuje mi czegoś bardzo podstawowego - sprawdziłem SO i Google, ale nie jestem w stanie tego rozgryźć. Dzięki!
"zaczynając od Objective-C, ale zdecydowałeś się wrócić do podstaw, zanim przejdziesz dalej" - doskonale, ** każdy początkujący powinien to zrobić. ** –
Właśnie zaczynałem czuć się jakbym uderzał krokami rodzajów w Obj-C. Od powrotu do C czuję się znowu kompletnym klutzem, ale mimo wielokrotnego uderzania głową o błędy segmentacji i dziwne zachowanie programu, zdecydowanie warto to zrobić. – drjimmie1976
Z pewnością warto. Opanowanie C jest nieuniknione dla zrozumienia Celu-C. –