Sto studiando il libro K & R. Attualmente sto leggendo la funzione getop() a p.78. Capisco il codice ma ho bisogno di chiarimenti su 2 cose.getop(), funzione K & R book p 78
Il codice di getop() è il seguente:
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;
}
mia domanda riguarda: s[0]
in:
while ((s[0] = c = getch()) == ' ' || c == '\t')
L'idea alla base del ciclo while è saltare spazi e tab orizzontale, quindi perché stiamo salvando 'c' in s [0]? Perché gli autori non hanno semplicemente scrivere:
while (c= getch() == ' ' || c == '\t')
Non abbiamo intenzione di utilizzare gli spazi e le schede più tardi, perché abbiamo bisogno di salvare c in s[0]
per? Qual è la necessità di s[0]
qui?
La mia seconda domanda riguarda:
s[1] = '\0';
perché stiamo assegnando lo '\ 0' (fine della stringa) per s[1]
qui?
Ho letto alcune delle risposte precedenti pubblicate su stackoverflow.com a riguardo ma non ne sono totalmente convinto!
La risposta accettata sulla domanda precedente è: "Perché la funzione potrebbe tornare prima che l'input rimanente venga letto, e quindi s deve essere una stringa completa (e terminata)."
Ok. Ma cosa succede se l'input ha uno spazio bianco all'inizio e seguito da un operando o operatore? In questo caso, s[1] = '\0'
chiuderà la stringa troppo presto? non è vero?
Una buona spiegazione, anche se rimuoverei aggettivi positivi come "conveniente", poiché ciò suggerisce che questo codice K & R disordinato segue una sorta di buona pratica di codifica in C, mentre in realtà è piena fino all'orlo dell'opposto. – Lundin
@Lundin: Sono completamente d'accordo sul fatto che il codice K & R in questione sia terribile da un punto di vista di "buona pratica di codifica", ma il codice illustra alcune novità del linguaggio C che sono importanti per i principianti. Dal punto di vista del design dell'algoritmo, e credo dalla prospettiva dell'autore originale del codice (molto prima che venissero concepite le "buone pratiche di codifica" di oggi), l'assegnazione a s [0] a questo punto del codice è un convenienza, dal momento che non dovrà essere eseguita in seguito. – sifferman