【问题标题】:Strtok segfault [duplicate]Strtok segfault [重复]
【发布时间】:2011-08-17 22:15:55
【问题描述】:

可能重复:
strtok giving Segmentation Fault

为什么我使用这段代码会出现段错误?

void test(char *data)
{
    char *pch;
    pch = strtok(data, " ,.-"); // segfault
    while (pch != NULL)
    {
        printf("%s\n", pch);
        pch = strtok(NULL, " ,.-");
    }

    return NULL;
}

char *data = "- This, a sample string.";
test(data);

【问题讨论】:

标签: c


【解决方案1】:

strtok() 修改原始字符串。您正在向它传递一个无法修改的 constant 源字符串。

试试这个:

char *data = strdup("- This, a sample string.");
test(data);

【讨论】:

  • 或者干脆char data[] = "- This, a sample string.";
  • 修改后的代码将演示一个不会崩溃的版本,因为编译时字符串文字被复制到一个新的堆分配缓冲区,从而允许 strtok 工作。
  • 这会造成内存泄漏,除非你记得在完成后释放数据。
  • ...我建议的替代方案也不会崩溃,因为编译时字符串文字被复制到新的堆栈分配缓冲区。
  • 另请注意,strdup 不是 ANSI C 的一部分,而是 POSIX。
【解决方案2】:

strtok 修改字符串。您正在传递一个指向只读数据(字符串常量)的指针。

尝试使用 char 数组。

char data[] ="- This, is a sample string."
test(data);

【讨论】:

    猜你喜欢
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    相关资源
    最近更新 更多