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/