【问题标题】:strtok when process two strings at same time同时处理两个字符串时的strtok
【发布时间】:2015-11-01 18:42:44
【问题描述】:

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->12>55->NULL 并跳过 54

我该如何处理这种情况?谢谢!!

【问题讨论】:

  • strsep 也是一个不错的选择,如果你有的话。
  • 作为 melpomene - strtok() 一次只能处理一个字符串。或者,您可以从一个字符串中提取所需的所有信息,然后处理另一个字符串。
  • 如上所述,strtok() 可以一次处理一个字符串。它基于“。”进行标记。 .所以起初,你的令牌是 token1:11 , token2:12 是不相等的。它打印 -1 并从 while 返回。

标签: c pointers strtok


【解决方案1】:

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

strtok_r()strtok 一样,只是将char **(即指向char * 的指针)传递给它,它可以保存到它要去的地方。

GNU libc manual page 给出了使用嵌套 strtok_r 的一个很好的例子,这就是你想要做的:

   #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);
   }

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 2014-08-13
    • 2021-01-10
    • 2015-03-09
    • 2013-01-27
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多