【发布时间】:2013-10-18 20:44:33
【问题描述】:
int i = 0;
while(fgets(lineStr, sizeof(lineStr), pFile)!=NULL){
puts(lineStr);
pch = strtok (lineStr, delim);
while(pch != NULL){
printf("%s\n",pch);
pch = strtok(NULL,delim);
}
}
概述:我正在尝试编写 grep 的微型版本(也就是在文本文件中查找单词的出现次数)。整个代码http://pastebin.com/VzTJkLK3
问题:我正在尝试使用 strtok 来标记表示一行文本的字符数组。我注意到使用 gdb 时会出现分段错误,例如
程序收到信号SIGSEGV,分段错误。 __strlen_sse2 () 在 ../sysdeps/x86_64/multiarch/../strlen.S:31 31 ../sysdeps/x86_64/multiarch/../strlen.S: 没有这样的文件或目录。
感谢任何指向更多文档的提示或链接。
PS:有人告诉我,使用 strtok 不是一个好的编程习惯——顺便说一句,我是 C 的菜鸟。你会推荐什么替代方案?
【问题讨论】:
-
strtok 的问题是每个线程一次只能执行一个循环。推荐的替代方案是
strtok_r,它使用附加参数而不是“全局”变量,但它不在 C 标准中(我认为它包含在 POSIX 标准中,只要你在 n x 你可以毫无问题地使用它)。 -
只要
lineStr是一个有效的缓冲区,delim是一个有效的字符串,pFile是一个有效的输入流,我在您的代码示例中看不到任何可能导致段错误的内容。 -
lineString 是在第 7 行初始化的 256 字节数组 pastebin.com/VzTJkLK3
-
您的样本不包括
<string.h>,这是声明strtok()的位置。 (以及strlen())。如果此代码与您的相同,您需要#include <string.h>,如果它可以正常工作,我会在您报告后解释原因。另外,选择一种语言。这一点看起来不像 C++ 代码,如果不是这样,则应该删除该语言标记。 -
我猜这个故事的寓意是不要忽视编译器警告。
标签: c string pointers segmentation-fault