Um zu verstehen, wie es strtok()
funktioniert, muss man zuerst wissen, was eine statische Variable ist. Dieser Link erklärt es ganz gut ....
Der Schlüssel für die Operation von strtok()
besteht darin, den Speicherort des letzten Trennzeichens zwischen aufeinanderfolgenden Aufrufen beizubehalten (aus diesem Grund wird strtok()
weiterhin die sehr ursprüngliche Zeichenfolge analysiert, die an sie übergeben wird, wenn sie mit einem null pointer
in aufeinanderfolgenden Aufrufen aufgerufen wird ).
Schau dir meine an strtok()
Implementierung an, zStrtok()
die eine etwas andere Funktionalität hat als die vonstrtok()
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;
}
Und hier ist ein Beispiel für die Verwendung
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)
Der Code stammt aus einer String-Verarbeitungsbibliothek, die ich auf Github verwalte und die zString heißt. Schauen Sie sich den Code an oder tragen Sie sogar dazu bei :)
https://github.com/fnoyanisi/zString
strtok()
Ändert die Argumentzeichenfolge, indem Token vor der Rückkehr mit NUL beendet werden. Wenn Sie versuchen, den gesamten Puffer (str []) zu untersuchen, wird er zwischen aufeinanderfolgenden Aufrufen von geändertstrtok()
.