尝试计算C中strtok()产生的令牌数量

时间:2018-09-28 20:31:19

标签: c count strtok

我当前正在实现一个程序,用户在其中输入带有值的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。感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

countfor循环内声明,因此在循环结束后不在范围内。您需要在循环之前声明它,并将其初始化为0

此外,您应将第一个strtok()的结果分配给token。否则,您将在循环中第一次测试未初始化的变量。

我不确定tmptmp2的用途,因为您从未使用过它们。我猜它们是针对您尚未添加的代码的,所以我把它们留了下来。

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