strtok在同时处理两个字符串时

C语言中的新function并且非常混淆了如何使用strtok同时处理多个字符串,简单来说,我想使用strtok提取数字并进行比较。

#include  #include  int main() { char s1[100]="11.54"; char s2[100]="12.55"; const char tok[2]="."; char* token1=strtok(s1,tok); char* token2=strtok(s2,tok); while(token1 !=NULL && token2 !=NULL){ int temp=strcmp(token1,token2); if(temp==0){ token1=strtok(NULL,tok); token2=strtok(NULL,tok); } else if(temp<0){ printf("%d\n",-1); return; } else{ printf("%d\n",1); return; } } if(token1 !=NULL){ printf("%d\n",1); return; } if(token2 !=NULL){ printf("%d\n",-1); return; } printf("%d\n",0); return 0; } 

但是当我使用strtok时,strtok(NULL,token)将指向当前字符串并将执行如下操作:11-> 12> 55-> NULL并跳过54

我怎么能处理这种情况? 谢谢!!

不要使用strtok() 。 文档将告诉你strtok()不是可重入的(即不应该跨线程使用),但可能不太明显的是它不可重入的原因是因为它使用内部save变量来记住它的位置。 这意味着您也不能同时使用两个实例。 而是使用strtok_r()或失败strsep()可能会工作。

strtok_r()就像strtok一样,除了你传递一个char ** (即一个指向char *的指针),它可以保存到达它的位置。

GNU libc手册页提供了一个使用嵌套strtok_r的好例子,这是你要做的:

  #include  #include  #include  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\n", 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\n", j, token); for (str2 = token; ; str2 = NULL) { subtoken = strtok_r(str2, argv[3], &saveptr2); if (subtoken == NULL) break; printf(" --> %s\n", subtoken); } } exit(EXIT_SUCCESS); }