Per comprendere come funziona il protocollo strtok()
, è necessario innanzitutto sapere cos'è un static variable. This link lo spiega abbastanza bene ....
La chiave per il funzionamento del strtok()
è preservare la posizione dell'ultimo separatore tra le chiamate seccessive (ecco perché strtok()
continua ad analizzare la stringa molto originale che viene passata ad esso quando viene richiamata con un null pointer
nelle chiamate successive). .
dai un'occhiata alla mia strtok()
implementazione, chiamato zStrtok()
, che ha una funzionalità sligtly diverso da quello fornito da strtok()
char *zStrtok(char *str, const char *delim) {
static char *static_str=0; /* var to store last address */
int index=0, strlength=0; /* integers for indexes */
int found = 0; /* check if delim is found */
/* delimiter cannot be NULL
* if no more char left, return NULL as well
*/
if (delim==0 || (str == 0 && static_str == 0))
return 0;
if (str == 0)
str = static_str;
/* get length of string */
while(str[strlength])
strlength++;
/* find the first occurance of delim */
for (index=0;index<strlength;index++)
if (str[index]==delim[0]) {
found=1;
break;
}
/* if delim is not contained in str, return str */
if (!found) {
static_str = 0;
return str;
}
/* check for consecutive delimiters
*if first char is delim, return delim
*/
if (str[0]==delim[0]) {
static_str = (str + 1);
return (char *)delim;
}
/* terminate the string
* this assignmetn requires char[], so str has to
* be char[] rather than *char
*/
str[index] = '\0';
/* save the rest of the string */
if ((str + index + 1)!=0)
static_str = (str + index + 1);
else
static_str = 0;
return str;
}
E qui è un esempio di utilizzo
Example Usage
char str[] = "A,B,,,C";
printf("1 %s\n",zStrtok(s,","));
printf("2 %s\n",zStrtok(NULL,","));
printf("3 %s\n",zStrtok(NULL,","));
printf("4 %s\n",zStrtok(NULL,","));
printf("5 %s\n",zStrtok(NULL,","));
printf("6 %s\n",zStrtok(NULL,","));
Example Output
1 A
2 B
3 ,
4 ,
5 C
6 (null)
Il codice è da a string processing library I maintain on Github, chiamato zString. Dai un'occhiata al codice, o persino contribuire :) https://github.com/fnoyanisi/zString
'strtok()' modifica la sua stringa argomento terminando i token con NUL prima di tornare. Se provate ad esaminare l'intero buffer (str []) vedrete che viene modificato tra chiamate successive a 'strtok()'. –
Invece di guardare 'str', guarda' str [0] ',' str [1] ',' str [2] ', ... – pmg
@pmg: Ho guardato str [0] e str [1] .str [1] dovrebbe essere '\ 0', ma era uno spazio lì. –