Ich studiere K & R Buch. Derzeit lese ich die Funktion getop() auf S.78. Ich verstehe den Code, aber ich brauche Erläuterungen über 2 Dinge.getop() Funktion K & R Buch p 78
Der Code von getop() ist wie folgt: ca.
int getch(void);
void ungetch(int);
/* getop: get next character or numeric operand */
int getop(char s[])
{
int i, c;
while ((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.')
return c; /* not a number */
i = 0;
if (isdigit(c)) /* collect integer part */
while (isdigit(s[++i] = c = getch()))
;
if (c == '.') /* collect fraction part */
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return NUMBER;
}
Meine Frage: s[0]
in:
while ((s[0] = c = getch()) == ' ' || c == '\t')
Die Idee hinter der while-Schleife ist Räume und horizontale Register zu überspringen, Warum speichern wir also 'c' in s [0]? Warum haben die Autoren nicht einfach schreiben:
while (c= getch() == ' ' || c == '\t')
Wir werden keine Leerzeichen und Tabulatoren später zu verwenden, warum brauchen wir c in s[0]
zu retten? Was ist die Notwendigkeit für s[0]
hier? über
Meine zweite Frage lautet:
s[1] = '\0';
Warum sind wir '\ 0' (Ende der Zeichenfolge) zu s[1]
hier zuweisen?
Ich habe einige der vorherigen Antworten auf stackoverflow.com darüber gelesen, aber ich bin nicht ganz davon überzeugt!
Die akzeptierte Antwort zu der obigen Frage lautet: "Da die Funktion möglicherweise zurückkehrt, bevor die verbleibende Eingabe gelesen wird, muss s eine vollständige (und abgeschlossene) Zeichenfolge sein."
Ok. Was aber, wenn die Eingabe am Anfang einen Leerraum hat und von einem Operanden oder Operator gefolgt wird? In diesem Fall wird s[1] = '\0'
die Zeichenfolge zu früh schließen? nicht wahr?
Gute Erklärung, obwohl ich positive Adjektive wie "bequem" entfernen würde, da dies darauf hindeutet, dass dieser unordentliche K & R-Code einer guten C-Kodierungspraxis folgt, während er bis zum Rand mit dem Gegenteil gefüllt ist. – Lundin
@Lundin: Ich stimme völlig zu, dass der fragliche K & R-Code aus einer "guten Programmierpraxis" heraus schrecklich ist, aber der Code zeigt bestimmte Neuheiten der C-Sprache, die für Anfänger wichtig sind. Aus der Sicht des Algorithmusentwurfs, und ich glaube, aus der Perspektive des ursprünglichen Verfassers des Codes (lange bevor die "guten Kodierungspraktiken" von heute erdacht wurden), ist die Zuordnung zu s [0] an diesem Punkt im Code a Bequemlichkeit, da es nicht später durchgeführt werden muss. – sifferman