我有一小部分代码,它以换行符分隔的单词作为输入,输出(word,1)作为输出。下面是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str1, *str2, *token;
char *saveptr1;
char buffer[100];
while (fgets(buffer, sizeof(buffer), stdin) != NULL) {
token = strtok_r(buffer, '\n', &saveptr1);
printf("(%s,1)\n", token);
}
exit(EXIT_SUCCESS);
}此代码工作正常,并提供预期的输出。但是,当我使用gdb执行代码时,在第9行中会出现以下错误:strtok_r行。
程序接收信号SIGSEGV,分割故障。strtok_r ()在./sysdeps/x86_64/strTok.S: 101 ./sysdeps/x86_64/strTok.S:没有这样的文件或目录。
这真是令人费解。我甚至没有“踏进”strtok_r行,我只是“下一个”它,也就是说,跨过去。为什么在GDB期间抛出此错误?我很焦虑,因为我有一个真正的,更大的程序,我无法调试,因为这个问题。实际上,对于大多数字符串函数(strncmp、strncpy)来说,都会出现这个问题。
编辑:编译器确实警告过使用整数做指针的赋值,而没有在这一行进行强制转换,我应该将2和2放在一起。
发布于 2016-01-18 02:11:11
如果将字符文本而不是字符串文本传递给strtok_r,库函数strtok_r会崩溃,试图取消引用无效指针。
GDB试图显示位于strtok_r中的../sysdeps/x86_64/strtok.S的程序集源代码(它从标准C库调试信息中知道这一点),但它无法在该位置找到源文件。
当然,您应该以这样的方式更正代码:
token = strtok_r(buffer, "\n", &saveptr1);最好用-Wall -Wextra -Werror启用尽可能多的来自编译器的警告,并修复代码,直到编译器不再检测到任何可疑的代码。
事实上,您提到了使用strncpy:这个函数非常容易发生错误。它不像大多数人想的那样,它永远不是正确的工具。阅读它的文档,并仔细验证您是否正确地使用它,以及在这些地方没有更好的替代方法。
https://stackoverflow.com/questions/34845496
复制相似问题