【问题标题】:strtok() returns weird values and segfaultstrtok() 返回奇怪的值和段错误
【发布时间】:2025-12-19 07:50:12
【问题描述】:

我正在使用strtok() 从从文件中获取的数据中提取字符。

这是我的代码:

fgets(text, 12, myFile);

printf ("text is: %s \n", &text);
char *token;
token = strtok(text, " ");
printf("first token is: %s \n", &token);

printf ("text is: %s \n", &text);
token = strtok(NULL, " ");
printf("second token is: %s \n", &token);

输出如下:

text is: 4 3       //this is the expected and correct value of "text"
first token is:  ڱ[? 
text is: 4        // I was expecting this to be 3 after getting the first token...
second token is: "ڱ[? 
Segmentation fault: 11

如您所见,strtok() 不仅没有得到正确的值,而且似乎以非常奇怪的顺序遍历了文本。关于为什么会这样的任何想法?非常感谢您!

【问题讨论】:

  • textchar 指针还是 char 的数组?我希望是后者。

标签: c strtok


【解决方案1】:

所有printf 中的%s 期望char*。你传递了&text&token,它们都是char**s。这会调用 C11 标准中所述的未定义行为:

7.21.6.1 fprintf 函数

[...]

  1. 如果转换规范无效,则行为未定义。 282 如果任何参数不是相应转换规范的正确类型,则行为未定义。

要解决此问题,请从所有 printfs 中删除与号,即替换以下所有语句:

printf ("text is: %s \n", &text);
printf("first token is: %s \n", &token);
printf ("text is: %s \n", &text);
printf("second token is: %s \n", &token);

printf ("text is: %s \n", text);
printf("first token is: %s \n", token);
printf ("text is: %s \n", text);
printf("second token is: %s \n", token);

【讨论】:

  • 只是对您从哪个网站复制报价感兴趣?
  • @Rizier123,Google for "n1570"。它会给你this。它是 C11 标准的草案。