尝试计算 C 中 strtok() 生成的标记数

Attempting to count the number of tokens produced by strtok() in C

我目前正在实施一个程序,用户可以在其中输入带值的推送或带值的弹出。为了拆分我使用的令牌 strtok()。除了用户输入三个值外,所有情况在我的程序中都运行良好:例如,正确的可接受输入是 "push 5" 或 "pop"。例如,当用户输入时: "push 5 7" 我希望能够计算出有 3 个令牌,因此拒绝输入。通过命令行参数的程序询问用户将通过 STDIN 输入多少行,因此我有一个 for 循环。使用我当前的计数器,第一个循环总是 returns 正确的标记数,但在它之后的每个循环 returns 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 令牌,但效果很好。同样,计数器对第一个 运行 有效,但始终对 returns 0 有效。感谢大家的帮助。

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