Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C strtok()分段故障_C_Segmentation Fault_Strtok - Fatal编程技术网

C strtok()分段故障

C strtok()分段故障,c,segmentation-fault,strtok,C,Segmentation Fault,Strtok,我已经看了其他问题等,我看到你不能在strtok中有一个不能编辑的第一个arg,但我认为我在这段代码中没有,但仍然得到一个seg错误?? 我用错strtok了吗 这段代码是以csv逗号分隔格式获取stdin,并从stdin中添加数字,然后将它们打印到stdout,p.s.当令牌不是指针时,我让它工作,例如i+=token但我得到的是随机输出,正如我所想的那样 #include <stdio.h> #include <string.h> int main(){ char *

我已经看了其他问题等,我看到你不能在strtok中有一个不能编辑的第一个arg,但我认为我在这段代码中没有,但仍然得到一个seg错误?? 我用错strtok了吗

这段代码是以csv逗号分隔格式获取stdin,并从stdin中添加数字,然后将它们打印到stdout,p.s.当令牌不是指针时,我让它工作,例如
i+=token但我得到的是随机输出,正如我所想的那样

#include <stdio.h>
#include <string.h>
int main(){
char *token, input[256];
int i = 0;

scanf("%s" , input);
token = strtok (input, ",");

while(token != NULL){
    token = strtok(NULL, ","); 
    i += *token;

        }                

printf("%d\n", i);
return 0;
    }
#包括
#包括
int main(){
字符*标记,输入[256];
int i=0;
扫描频率(“%s”,输入);
令牌=strtok(输入“,”);
while(令牌!=NULL){
令牌=strtok(空,“”,“”);
i+=*令牌;
}                
printf(“%d\n”,i);
返回0;
}

感谢Lachlan

在某个时刻,strtok
将返回
NULL
,您不会检查:

token = strtok(NULL, ","); 
i += *token; /* Will dereference NULL. */
相反,你应该做:

while(token != NULL){
    i += *token; /* We know `token` isn't NULL. */
    token = strtok(NULL, ","); 
}

作为旁注,您正在做的事情—添加字符值—没有什么意义。您可能希望以某种方式转换它们,可能在某个时候使用
strto(u)l
将返回
NULL
,您不会检查:

token = strtok(NULL, ","); 
i += *token; /* Will dereference NULL. */
相反,你应该做:

while(token != NULL){
    i += *token; /* We know `token` isn't NULL. */
    token = strtok(NULL, ","); 
}

作为旁注,您正在做的事情—添加字符值—没有什么意义。您可能希望以某种方式转换它们,可能是使用
strto(u)l

在执行
i+=*token
之前,您需要将字符串转换为整数,请查看将字符串转换为整数的函数,例如
strtol

在执行
i+=*token
之前,您需要将字符串转换为整数,看看将字符串转换为整数的函数,例如
strtol

Doh!抱歉,请原谅我的无知,我在研究中没有发现它。是否将令牌更改为空?LachlanMcGivern
strtol
不会更改它的第一个参数。但是我的
scanf“%s”,input
不会工作,因为它会在字符串的末尾添加空值??scanf man所说的与
NULL
?Doh!抱歉,请原谅我的无知,我在研究中没有发现它。是否将令牌更改为空?LachlanMcGivern
strtol
不会更改它的第一个参数。但是我的
scanf“%s”,input
不会工作,因为它会在字符串的末尾添加空值??scanf man所说的与
NULL
相同吗?