Parlando di standard c89/90 (scelta obbligata) ho difficoltà a capire il seguente algoritmo che utilizza la funzione strtok dove deve dividere una stringa in linee e ogni linea a sua volta in parole senza far uso dell'amica strtok_r che aderisce allo standard posix e non rispetterebbe lo standard prima citato.
Mi sono letto un po' di info sulla strtok, credo di aver chiaro come funziona ma nonostante ciò non mi torna questo codice:
#include <string.h>
#include <stdio.h>
int main ()
{
char str[] = "a;b;c;d;e\nf;g;h;i;j\n1;2;3;4;5\n";
char *line;
char *token;
char buf[256];
for (line = strtok (str, "\n"); line != NULL; line = strtok (line + strlen (line) + 1, "\n"))
{
strncpy (buf, line, sizeof (buf));
printf ("Line: %s\n", buf);
for (token = strtok (buf, ";"); token != NULL; token = strtok (token + strlen (token) + 1, ";"))
printf ("\tToken: %s\n", token);
}
return 0;
}
in paarticolare non mi torna in entrambi i for questa porzione di codice:
line = strtok (line + strlen (line) + 1, "\n")
token = strtok (token + strlen (token) + 1, ";")
Se p.e. ci focalizziamo nella primo for, che si occupa di separare le righe utilizzando come delimitatore “\n”, e controlliamo gli effetti della funzione strtok:
1o step del for:
str - > "a;b;c;d;e\0f;g;h;i;j\n1;2;3;4;5\n"
line - > "a;b;c;d;e\0"
2o step del for:
str - > "a;b;c;d;e\0f;g;h;i;j\01;2;3;4;5\n"
line - > "f;g;h;i;j\0"
3o step del for:
str - > "a;b;c;d;e\0f;g;h;i;j\01;2;3;4;5\0"
line - > "1;2;3;4;5\0"
4o step del for:
str - > "a;b;c;d;e\0f;g;h;i;j\01;2;3;4;5\0"
line - > &str[30] !?!??!?!
considerando che
str[28] = ‘5’
str[29] = ‘\0’
line dovrebbe puntare al carattere di str che si trova dopo l'ultimo ‘\0’, per cui quel carattere è indefinito, non sappiamo cosa ci sia in memoria ed il comportamento dell'algoritmo non è prevedibile.
La stessa cosa, a mio avviso, accade quando il secondo for ha terminato di analizzare l'ultima parola della stringa.
Questo codice va bene fintanto non hai completato l'analisi dell'ultimo token.
cosa ne pensate ?'