我正在开发一个涉及使用strtok
的项目,由于某种原因,我得到空值而不是实际值(应该是“Two”和“Three”)。这是我的代码:
int main(){
int h,z;
char text[100] = "One Two Three";
for(h = 0; h < 4; h ++){
char *first = strtok(text, " ");
printf("%s\n",first);
for(z = 0; z < 3; z++){
char *second = strtok(NULL, " ");
printf("%s\n",second);
}
}
return 0;
}
我得到的输出是:
One
Two
Three
One
(null)
(null)
One
(null)
(null)
One
(null)
(null)
我可以做些什么来获得正确的值Two
和Three
而不是null?
答案 0 :(得分:1)
您可以对字符串进行标记,将其保存在双指针中,然后将其打印多次!
答案 1 :(得分:0)
请注意,您的代码实际上会将字符串text
重新标记4次,因为您有嵌套循环。另请注意,z < 3
只有一个,应该是z < 2
:
int main(){
int h,z;
char text[100] = "One Two Three";
for(h = 0; h < 4; h ++){
char *first = strtok(text, " ");
printf("%s\n",first);
for(z = 0; z < 2; z++){
char *second = strtok(NULL, " ");
printf("%s\n",second);
}
}
return 0;
}
但strtok
每次找到令牌时都会引入'\0'
个字符。因此,在第一次运行for(h...)
- 循环后,text
将为"One"
,对于任何后续循环,只能找到一个标记; "One"
中不存在令牌#2和#3。
要重新标记(无论出于何种原因),您必须重新初始化text
:
int main(){
int h,z;
char text[100];
for(h = 0; h < 4; h ++){
strcpy(text,"One Two Three");
char *first = strtok(text, " ");
printf("%s\n",first);
for(z = 0; z < 2; z++){
char *second = strtok(NULL, " ");
printf("%s\n",second);
}
}
return 0;
}