strtok 未按预期工作,仅适用于前几次迭代
strtok not working as expected, works only for first few iterations
我正在使用 strtok 拆分字符串,它在前 4 次迭代中按预期工作,但在那之后开始搞砸了。该程序应该采用诸如 "david 1 2 3 4 5" 之类的行并打印出名称加上数字的总和 "david 15"... 但是我遇到了 strtok 问题。
编辑:我将数字作为以后使用代码的指针(这只是一个片段)
这是我的 C 脚本:
#include <stdio.h>
#include <string.h>
char str1[50];
char *token;
char *end;
long int *number;
int loop = 1;
while(loop){
fgets(str1,50,stdin);
token = strtok(str1," ");
printf("%s ",token);
*number = 0;
while(token != NULL){
token = strtok(NULL," ");
if(token != NULL){
*number = *number + strtol(token,&end,0);
}
}
printf("%li\n",*number);
}
有了这个输入:
David 10 10 10 10 10
我得到这个输出:
David 40
预期输出为:
David 50
怀疑是 strtok,我把这些测试打印语句:
char str1[50];
char *token;
char *end;
long int *number;
int loop = 1;
while(loop){
fgets(str1,50,stdin);
token = strtok(str1," ");
printf("%s\n",token);
*number = 0;
while(token != NULL){
printf("before new token: %s\n",token); // <---HERE
token = strtok(NULL," ");
printf("after new token: %s\n\n",token); // <---HERE
if(token != NULL){
*number = *number + strtol(token,&end,0);
}
}
printf("%li\n",*number);
}
并使用相同的输入:
David 10 20 30 40 50
我得到:
David
before new token: David
after new token: 10
before new token: 10
after new token: 20
before new token: 20
after new token: 30
before new token: 30
after new token: 4<
before new token: 4@
after new token: (null)
64
如您所见,它在前几次迭代中运行良好,但之后情况开始变糟。如果有人知道发生了什么,我将不胜感激 :) 谢谢!
变量 number
是一个指针(为什么?)但是你永远不会让它指向任何地方,因此当你取消引用它时你将得到 undefined behavior.
简单的解决方案? 不要让它成为指针!
你得到 40 而不是 50 的原因是你放弃了第一个标记(即你在通过 str1
时从 strtok
获得的标记,而不是 NULL
)。在进入循环之前需要先把它加到sum中,或者重新组织循环先加然后调用strtok
next:
number = 0; // There is no point in making "number" a pointer
token = strtok(str1," ");
while(token != NULL){
printf("%s ",token);
number += strtol(token,&end,0);
token = strtok(NULL," ");
}
我正在使用 strtok 拆分字符串,它在前 4 次迭代中按预期工作,但在那之后开始搞砸了。该程序应该采用诸如 "david 1 2 3 4 5" 之类的行并打印出名称加上数字的总和 "david 15"... 但是我遇到了 strtok 问题。
编辑:我将数字作为以后使用代码的指针(这只是一个片段)
这是我的 C 脚本:
#include <stdio.h>
#include <string.h>
char str1[50];
char *token;
char *end;
long int *number;
int loop = 1;
while(loop){
fgets(str1,50,stdin);
token = strtok(str1," ");
printf("%s ",token);
*number = 0;
while(token != NULL){
token = strtok(NULL," ");
if(token != NULL){
*number = *number + strtol(token,&end,0);
}
}
printf("%li\n",*number);
}
有了这个输入:
David 10 10 10 10 10
我得到这个输出:
David 40
预期输出为:
David 50
怀疑是 strtok,我把这些测试打印语句:
char str1[50];
char *token;
char *end;
long int *number;
int loop = 1;
while(loop){
fgets(str1,50,stdin);
token = strtok(str1," ");
printf("%s\n",token);
*number = 0;
while(token != NULL){
printf("before new token: %s\n",token); // <---HERE
token = strtok(NULL," ");
printf("after new token: %s\n\n",token); // <---HERE
if(token != NULL){
*number = *number + strtol(token,&end,0);
}
}
printf("%li\n",*number);
}
并使用相同的输入:
David 10 20 30 40 50
我得到:
David
before new token: David
after new token: 10
before new token: 10
after new token: 20
before new token: 20
after new token: 30
before new token: 30
after new token: 4<
before new token: 4@
after new token: (null)
64
如您所见,它在前几次迭代中运行良好,但之后情况开始变糟。如果有人知道发生了什么,我将不胜感激 :) 谢谢!
变量 number
是一个指针(为什么?)但是你永远不会让它指向任何地方,因此当你取消引用它时你将得到 undefined behavior.
简单的解决方案? 不要让它成为指针!
你得到 40 而不是 50 的原因是你放弃了第一个标记(即你在通过 str1
时从 strtok
获得的标记,而不是 NULL
)。在进入循环之前需要先把它加到sum中,或者重新组织循环先加然后调用strtok
next:
number = 0; // There is no point in making "number" a pointer
token = strtok(str1," ");
while(token != NULL){
printf("%s ",token);
number += strtol(token,&end,0);
token = strtok(NULL," ");
}