2

我正在使用 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

如您所见,它在最初的几次迭代中运行良好,但之后事情开始变糟。如果有人知道发生了什么,我将不胜感激:)谢谢!

4

2 回答 2

4

该变量number是一个指针(为什么?),但你永远不会让它指向任何地方,因此当你取消引用它时,你将有未定义的行为

简单的解决方案?不要让它成为指针!

于 2015-05-02T11:39:48.947 回答
1

您获得 40 而不是 50 的原因是您丢弃了第一个令牌(即strtok您通过时获得的令牌str1,而不是NULL)。你需要在进入循环之前将其添加到sum中,或者重新组织循环以先添加并调用strtoknext:

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

演示。

于 2015-05-02T11:40:35.753 回答