c - 同时处理两个字符串时的strtok

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

遇到这种情况我怎么办?谢谢!!

最佳答案

请勿使用 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);
   }

关于c - 同时处理两个字符串时的strtok,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33465800/

相关文章:

c - 在 C 程序中出现运行时错误

c++ - 在 C++ 中解析参数

C语言编程

c - 删除 char 数组中的第一个标记并将其余部分保留在 C 中

c - 有没有办法提供一个宏函数来返回不同类型的值,包括什么都没有?

c - 如何在C中组合3个二进制数据?

c - 二维数组是双指针吗?

c++ - 如何使用指针从不同的函数访问局部变量?

C:内存分配 - 以下结构是一个简单的解决方法吗?

C - 为什么允许我这样做?