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

时间:2015-11-01 18:42:45

标签: c pointers strtok

C中的新功能并且很惊讶如何使用strtok同时处理多个字符串,简单来说,我想使用strtok提取数字并进行比较。

#include <stdio.h>
#include <string.h>
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-&gt; 12&gt; 55-&gt; NULL并跳过54

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

1 个答案:

答案 0 :(得分:3)

请勿使用strtok()。文档将告诉您strtok()不可重入(即不应跨线程使用),但可能不太明显的是,它不可重入的原因是因为它使用内部save变量来记住它到达的地方。这意味着您也无法同时使用两个实例。而是使用strtok_r()或使strsep()无效。

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

GNU libc manual page提供了一个使用嵌套 #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\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); } 的好例子,这就是您要做的事情:

$obj = json_decode($result);