【问题标题】:strtok() seg faultstrtok() 段错误
【发布时间】:2012-04-13 08:18:16
【问题描述】:

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

此代码是以 csv 逗号分隔格式获取标准输入,并将标准输入中的数字添加到标准输出中,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;
    }

谢谢拉克兰

【问题讨论】:

    标签: c segmentation-fault strtok


    【解决方案1】:

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

    【讨论】:

    • 噢!谢谢抱歉。
    • 请原谅我的无知,我在研究中没有发现 strtol(token) 是否将令牌更改为 NULL
    • @LachlanMcGivern strtol 不会改变它的第一个参数。
    • 但我的scanf"%s", input 将不起作用,因为它在字符串的末尾添加了一个空值?无论如何,scanf 人所说的和NULL 一样吗?
    【解决方案2】:

    在做i+=*token之前需要先将字符串转换为整数,看看strtol等函数将字符串转换为整数。

    【讨论】:

      猜你喜欢
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多