C strtok没有按预期工作,只在最初的几个迭代中工作

C strtok没有按预期工作,只在最初的几个迭代中工作,c,strtok,string.h,C,Strtok,String.h,我使用strtok来拆分字符串,它在前4次迭代中按预期工作,但在那之后开始出错。该程序应该采取一行,如“大卫1 2 3 4 5”,并打印出名称加上数字的总和“大卫15”。。。然而,我有一个与斯特托克的问题 编辑:我将数字作为以后代码使用的指针(这只是一个片段) 这是我的C脚本: #include <stdio.h> #include <string.h> char str1[50]; char *token; char *end; long int *number; i

我使用strtok来拆分字符串,它在前4次迭代中按预期工作,但在那之后开始出错。该程序应该采取一行,如“大卫1 2 3 4 5”,并打印出名称加上数字的总和“大卫15”。。。然而,我有一个与斯特托克的问题

编辑:我将数字作为以后代码使用的指针(这只是一个片段)

这是我的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 40
预期产出为:

David 50
出于对斯特托克的怀疑,我把这些测试打印出来:

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
新令牌之前:David
新令牌后:10
新代币前:10
新令牌后:20
新代币前:20
新令牌后:30
新代币前:30
新令牌之后:4<
新令牌之前:4@
新令牌之后:(空)
64

正如您所看到的,它在最初的几个迭代中工作得很好,但是在那之后事情开始变得糟糕。如果有人知道发生了什么,我将非常感谢你的建议:)谢谢

变量
number
是一个指针(为什么?),但您从未将其指向任何地方,因此,当您取消引用它时,您将有一个指针


简单的解决方案?不要把它当作指针

您得到40而不是50的原因是您丢弃了第一个令牌(即当您通过
str1
时从
strtok
获得的令牌,而不是
NULL
)。您需要在进入循环之前将其添加到总和中,或者重新组织循环以首先添加,然后调用
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," ");
}

只是为了好玩,如果在
40
之后添加空格会怎么样?40之后已经有空格了。输入是David 10 20 30 40 50
number
不指向任何已定义的内容…在您的特定情况下,未初始化的
number
指针恰好指向
str[16]
,值
40
中的
0
字符。这意味着在求和值时修改输入字符串。添加10、20和30后,
str[16]
设置为60(小尾端),这是
的ASCII码,请参阅我的编辑。我需要它作为以后使用的指针,这只是一个片段。@Vaderico您仍然需要将它指向某个地方。另外,您很可能不需要它作为指针,因为您可以使用例如
&number
从非指针变量生成指针。顺便说一下,我正在用C编程。嗯,不行,我把打印放在while循环的strtok行之前,也是这样thing@Vaderico对我来说很合适。请看我在答案底部添加的演示链接。啊,好的,刚刚检查过,效果非常好。非常感谢你!向上投票
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," ");
}