Do not use strtok()
. The documentation will tell you strtok()
is not reentrant (i.e. should not be used across threads), but perhaps less obvious is the fact that the reason it is not reentrant is because it uses an internal save
variable to remember where it's got to. That means you also can't use two instances at once. Instead use strtok_r()
or failing that strsep()
might work.
strtok_r()
is just like strtok
, save that you pass it a char **
(i.e. a pointer to char *
) where it can save where it's got to.
The GNU libc manual page gives a good example of using a nested strtok_r
which is what you are trying to do:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char *argv[])
{
char *str1, *str2, *token, *subtoken;
char *saveptr1, *saveptr2;
int j;
if (argc != 4) {
fprintf(stderr, "Usage: %s string delim subdelim
",
argv[0]);
exit(EXIT_FAILURE);
}
for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
token = strtok_r(str1, argv[2], &saveptr1);
if (token == NULL)
break;
printf("%d: %s
", j, token);
for (str2 = token; ; str2 = NULL) {
subtoken = strtok_r(str2, argv[3], &saveptr2);
if (subtoken == NULL)
break;
printf(" --> %s
", subtoken);
}
}
exit(EXIT_SUCCESS);
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…