strtok lors du traitement de deux chaînes en même temps

Nouveau en C et assez confus quant à la façon de traiter plusieurs chaînes en même temps en utilisant strtok. Par exemple, je souhaite utiliser strtok pour extraire le nombre et comparer.

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

Mais quand j’utilise le strtok, le strtok (NULL, jeton) pointera sur la chaîne en cours et fera comme: 11-> 12> 55-> NULL et ignorer le 54

Comment pourrais-je faire face à une telle situation? Merci!!

N’utilisez pas strtok() . La documentation vous dira que strtok() n’est pas réentrant (c.-à-d. Ne devrait pas être utilisé sur plusieurs threads), mais le fait que la raison pour laquelle il n’est pas réentrant est peut-être moins évident, car il utilise une variable de save interne pour se rappeler où il doit en être. Cela signifie que vous ne pouvez pas non plus utiliser deux instances à la fois. À la place, utilisez strtok_r() ou si vous ne le strsep() pas, strsep() pourrait fonctionner.

strtok_r() est comme strtok , sauf que vous lui transmettez un caractère char ** (c’est-à-dire un pointeur sur char * ) où il peut sauvegarder où il doit aller.

La page de manuel GNU libc donne un bon exemple d’utilisation d’un strtok_r nested, ce que vous essayez de faire:

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