我当前正在实现一个程序,用户在其中输入带有值的push或带有值的pop。为了拆分令牌,我使用strtok()
。除非用户输入三个值,否则所有情况在我的程序中都可以正常工作:例如,正确的可接受输入应为“ push 5”或“ pop”。例如,当用户输入“ push 5 7”时,我希望能够计算出3个令牌,因此拒绝输入。该程序通过命令行参数询问用户将通过STDIN
输入多少行,因此我有一个for循环。使用我当前的计数器,它总是在第一个循环中返回正确数目的令牌,但是在它返回0以后的每个循环中。
int main(int argc, char *argv[]){
int numlines = atoi(argv[1]);
for(int i = 1; i<= numlines; i++){
char str[256];
fgets(str,256,stdin);
str[strcspn(str, "\n")] = 0;
char *tmp;
char *token;
char *tmp2;
int count; //This is the counter for the tokens
tmp = strtok(str," ");
while(token != NULL){
tmp2 = token;
token = strtok(NULL, " ");
count++;
}
printf("%d\n", count);
}
底部还有更多代码可以操纵tmp和tmp2令牌,但是效果很好。同样,该计数器在第一次运行时起作用,但之后始终返回0。感谢您的帮助。
答案 0 :(得分:4)
count
在for
循环内声明,因此在循环结束后不在范围内。您需要在循环之前声明它,并将其初始化为0
。
此外,您应将第一个strtok()
的结果分配给token
。否则,您将在循环中第一次测试未初始化的变量。
我不确定tmp
和tmp2
的用途,因为您从未使用过它们。我猜它们是针对您尚未添加的代码的,所以我把它们留了下来。
int main(int argc, char *argv[]){
int numlines = atoi(argv[1]);
int count = 0; //This is the counter for the tokens
for(int i = 1; i<= numlines; i++){
char str[256];
fgets(str,256,stdin);
str[strcspn(str, "\n")] = 0;
char *tmp;
char *token;
char *tmp2;
tmp = token = strtok(str," ");
while(token != NULL){
tmp2 = token;
token = strtok(NULL, " ");
count++;
}
}
printf("%d\n", count);
}