2012-04-13 58 views
1

我已经看过其他问题等,我已经看到你不能在strtok中有第一个参数不能被编辑,但我不认为我有这个代码,但仍然获得seg故障? 我使用strtok错了吗?strtok()seg fault

此代码是以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; 
    } 

由于拉克兰

回答

7

在某些时候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

+0

Doh!非常抱歉。 – UNECS 2012-04-13 08:22:30

+0

请原谅我的无知,我没有在我的研究中发现它'strtol(token)'将标记更改为'NULL'? – UNECS 2012-04-13 09:01:26

+0

@LachlanMcGivern'strtol'不会改变它的第一个参数。 – cnicutar 2012-04-13 09:05:24

0

在做i+=*token之前,您需要先将字符串转换为整数,然后查看将字符串转换为整数的函数,如strtol