Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
579 views
in Technique[技术] by (71.8m points)

c - strtok when process two strings at same time

New in C and pretty confused about how to deal with several strings at the same time using strtok, for a simply example, I want to use strtok to extract the number and compare then.

#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
",-1);
     return;
   } 
   else{
        printf("%d
",1);
      return;
   }

}

if(token1 !=NULL){
  printf("%d
",1);
  return; 
} 
if(token2 !=NULL){
   printf("%d
",-1);
   return;
}

printf("%d
",0);

return 0;
}

But when I use the strtok, the strtok(NULL,token)will point to the current string and will do like: 11->12>55->NULL and skip the 54

How could I deal with such situation? Thanks!!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...