【问题标题】:Seg fault with strtokstrtok 的段错误
【发布时间】:2013-03-23 03:38:18
【问题描述】:

大家好,我的 strtok 出现了段错误,需要一点帮助!

char s[1024];
char *token[2];
while(fgets(s, sizeof(s), fp) != NULL) // Read line from file fp until end
{
    token[0] = strtok(s, "\t\n");
    token[1] = strtok(NULL, "\t\n");
    token[2] = strtok(NULL, "\t\n");
    printf("%d:%s:%d", atoi(token[0]), token[1], atoi(token[2]));
}

但是在循环的第一次逾越节后我得到了一个段错误。 输入文件如下所示:

102910319    code    mark
.
.
.
104981851    code    mark

但是 while 循环只正确打印第一行,而在第二行出现段错误。

有什么想法吗?

谢谢。

【问题讨论】:

  • 我的第一个猜测:您声明了token[2],但您访问了 3 个元素
  • 也可以,修复数组声明后可能会遇到数据问题: - 列之间的白色字符不是\t。
  • 已修复,但仍出现 seg 错误! @jimmcnamara 不,它们都是 \t (标签)。
  • 对于token[1]token[2],我们需要\t\n 还是只需要\t 作为分隔符?
  • 您的代码将在非 \t 空白字符上出现段错误。因为您将提前返回 NULL。例如,token[2] 可以为 NULL。检查命令的输出:od -c inputfile |更多。

标签: c linux segmentation-fault strtok


【解决方案1】:

数组索引问题。

你应该如下声明指针数组,

char *token[3];

【讨论】:

    【解决方案2】:

    正如杰克所说,令牌被声明存储两个char *s:token[0]token[1]token[2] 超出范围。解决方案是更改您的令牌声明:char *token[3];

    此外,您可能在某处提供了少于三个“单词”的输入,其中%s 将告诉 printf 打印一个由空指针指向的字符串,或者第二个 atoi 调用将尝试取消引用空指针。解决方案是在将token[1] 传递给printf 之前检查token[2],然后再将其传递给atoiprintf("%d:%s:%d", atoi(token[0]), token[1] ? token[1] : "null", token[2] ? atoi(token[2]) : 0);

    另外,看起来 scanf 可能更适合这个:

    int x, y;
    char str[1024];
    while (scanf("%d %1023s %d", &x, str, &y) == 3) {
        printf("%d:%s:%d\n", x, str, y);
    }
    

    【讨论】:

    • 谢谢,我找到了问题。这是为输入提供的文本文件有一个错误,其中一个“选项卡”实际上是几个空格。修复它,瞧它的工作原理!
    • @Travv92 我发布的 scanf 代码可以成功处理重复的制表符、空格和换行符(任意组合)......因此,我相信 scanf 会更合适。
    【解决方案3】:

    你做的

    char *token[2]
    

    它只能分配两个字符指针而不是三个。

    【讨论】:

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