gpt4 book ai didi

c - fscanf() 函数中的段错误

转载 作者:行者123 更新时间:2023-11-30 15:33:00 26 4
gpt4 key购买 nike

我正在为 C 单词搜索程序编写一些代码,在编译其中一个文件时,我在 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);
}
}

我希望“nl”(行数)读取 3,“nc”(操作系统列数)读取其他 3 个。

“t01.in”文件:

3 3
SIA
ORR
EDI

最佳答案

每当您打开外部资源(文件、数据库、套接字)或进行任何系统调用时,您始终会检查有效的流或返回代码。

您应该做的第一件事是添加对流的检查,而不是在不知道 fopen() 调用是否成功的情况下盲目调用 fscanf(stream,...) 。

然后确定 fopen() 失败的原因。我建议打印出文件名,或检查它是否存在,和/或使用 perror() 打印系统错误。 perror() 会告诉你到底出了什么问题,如果我不得不猜测,那就是@BLUEPIXY提到的,文件名中的换行符。

stream = fopen(buffer,"r");
if(!stream) {
perror("what the problem: ");
}

最后,学习如何使用调试器来分析核心文件。如果您没有获得核心转储,请正确设置 ulimit。根据内存,您需要“ulimit -c unlimited”。只需在 shell 提示符下键入“ulimit”即可找出当前的 ulimit。然后重新运行崩溃的程序。获得核心文件后,对其运行 GNU 调试器。

gdb program.exe core

关于c - fscanf() 函数中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23874667/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com