我正在为C wordsearch程序编写一些代码,并且在编译其中一个文件时,我在fscanf函数上得到了分段错误,但我不知道错误在哪里。 我已经搜索了答案,我明白在整数变量上我必须初始化它们的值(我已经完成了)并且我必须将fscanf()中的类型引用到'&' (也是这样做的。)
这是代码(在main()函数中):
int i;
int nl = 0;
int nc = 0;
int a, b, d;
char mat[1000][1000];//character matrix for wordsearch letters
int x[1000], y[1000];
int l, c, n;
printf("Chose the wordsearch you want to use.\n For example: t01.in, t02.in, t03.in, t04.in, (...),t30.in\n");
char wordsearch_file[8];
fgets(wordsearch_file,8,stdin);//user enters f.e. 't01.in'
FILE *stream;
char buffer[1024];
sprintf(buffer, "home/adminuser/Desktop/LA/ETAPA2/sopas/%s", wordsearch_file);
stream = fopen(buffer,"r");
if((fscanf (stream,"%d%d", &nl, &nc)) > 0){ // SEG. FAULT happens here
for(l = 0; l < nl; l++) {
for(c = 0; c < nc; c++)
mat[l][c] = fgetc(stream) != EOF;
fgetc(stream);
}
}
我想要&#39; nl&#39; (行数)读3和&#39; nc&#39; (编号os列)阅读其他3。
&#39; t01.in&#39;文件:
3 3
SIA
ORR
EDI
答案 0 :(得分:1)
无论何时打开外部资源(文件,数据库,套接字)或进行任何系统调用,您始终都会检查有效的流或返回代码。
你应该做的第一件事是添加一个流检查,而不是盲目地调用fscanf(stream,...)而不知道fopen()调用是否成功。
然后决定fopen()失败的原因。我建议打印出filenamne,或检查它是否存在,和/或使用perror()来打印系统错误。 perror()会告诉你到底出了什么问题,如果我不得不猜测,那就像@BLUEPIXY提到的那样,文件名中有换行符。
stream = fopen(buffer,"r");
if(!stream) {
perror("what the problem: ");
}
最后,学习如何使用调试器来分析核心文件。如果您没有获得核心转储,请正确设置ulimit。从记忆中,你想要&#34; ulimit -c unlimited&#34;。只需输入&#34; ulimit&#34;即可找出当前的ulimits。在shell提示符下。然后重新运行崩溃程序。获得核心文件后,在其上运行GNU调试器。
gdb program.exe core