Sono nuovo alla programmazione, partendo da Objective-C ma ho deciso di tornare alle basi prima di progredire ulteriormente. Sto passando un po 'di tempo in C, e sto lottando attraverso la confusione del puntatore. La mia domanda è su come K & R dice che fgets è implementato (p165, 2a ed.) Il codice qui sotto è diretto dal testo con un paio di miei commenti.implementazione di 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) Passiamo un char * s alla funzione fgets, alla cui posizione abbiamo memorizzare l'input dell'utente. Perché è necessario dichiarare il char * cs locale e quindi inizializzarlo su s? Perché non possiamo manipolare/aggiungere direttamente a s all'interno dell'istruzione if? Vedere come cs è inizializzato al punto s, non sta aggiungendo i caratteri in cs esattamente la stessa cosa?
2) Legato con il precedente ... Quando la funzione ritorna, viene effettuato un test per vedere se cs == s. Perché è necessario?
Penso che possa mancare qualcosa di fondamentale: ho controllato SO e Google ma non riesco a capirlo. Grazie!
"Iniziare con Objective-C ma ho deciso di tornare alle basi prima di progredire ulteriormente" - eccellente, ** ogni principiante dovrebbe farlo. ** –
Stavo cominciando a sentire che stavo colpendo una specie di falcata in Obj-C. Da quando torno a C mi sento di nuovo un klutz completo, ma nonostante abbia ripetutamente sbattuto la testa contro i difetti di segmentazione e il comportamento strano del programma, ne vale sicuramente la pena. – drjimmie1976
Ne vale sicuramente la pena. La padronanza di C è inevitabile per la comprensione dell'Obiettivo-C. –