fgets Implementierung (K & R)

8

Ich bin neu in der Programmierung und beginne mit Objective-C, habe aber beschlossen, zu den Grundlagen zurückzukehren, bevor ich weiterarbeite. Ich verbringe etwas Zeit mit C und kämpfe mich durch die Verwirrung der Zeiger. Meine Frage ist, wie K & amp; R sagt, fgets ist implementiert (P165, 2. Aufl.) Code unten ist direkt aus dem Text mit ein paar meiner Kommentare.

%Vor%

1) Wir übergeben ein char * s an die fgets-Funktion, an deren Stelle wir die Benutzereingabe speichern. Warum müssen die lokalen char * cs deklariert werden - und dann mit s initialisiert werden? Warum können wir innerhalb der if-Anweisung nicht direkt s manipulieren / hinzufügen? Da cs zu Punkt s initialisiert wird, werden die Zeichen nicht genau zu cs hinzugefügt?

2) Eingebunden mit dem obigen ... Wenn die Funktion zurückkehrt, wird ein Test durchgeführt, um zu sehen, ob cs == s ist. Warum ist das notwendig?

Ich denke, dass ich etwas sehr Grundlegendes vermisse - ich habe SO und Google überprüft, kann es aber nicht genau herausfinden. Vielen Dank!

    
drjimmie1976 06.05.2013, 11:30
quelle

1 Antwort

7

Es liegt an der letzten Zeile, cs == s . Dieser Vergleich prüft den modifizierten Zeiger cs gegen den ursprünglichen s , um zu sehen, ob wir irgendein Zeichen gelesen haben. Wenn nicht, geben wir NULL zurück.

Durch die Verwendung von cs im ursprünglichen Zeiger bleibt s erhalten. Wenn s direkt manipuliert würde ( *s++ anstelle von *cs++ ), müssten wir einen anderen Weg finden, um zu überprüfen, ob irgendwelche Zeichen gelesen wurden.

Man kann auch argumentieren, dass es eine gute Übung ist, Funktionsparameter allein zu belassen und sie als const zu behandeln. Einige Programmierer folgen dieser Praxis, um die Code-Klarheit zu verbessern.

    
John Kugelman 06.05.2013, 11:33
quelle

Tags und Links