我正在为一个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’(编号os列)读取其他3。
't01.in‘文件:
3 3
SIA
ORR
EDI发布于 2014-05-26 17:01:13
当您打开外部资源(文件、数据库、套接字)或进行任何系统调用时,始终检查是否有有效的流或返回代码。
您应该做的第一件事是为流添加一个检查,而不是盲目地调用fscanf( stream,.)而不知道fopen()调用是否成功。
然后决定为什么fopen()失败。我建议打印出文件,或者检查它是否存在,并/或使用perror()打印系统错误。perror()会告诉您到底出了什么问题,如果我不得不猜测的话,就像@BLUEPIXY所提到的那样,文件名中的一个换行符。
stream = fopen(buffer,"r");
if(!stream) {
perror("what the problem: ");
}最后,学习如何使用调试器来分析核心文件。如果您没有得到一个核心转储,设置您的ulimit正确。从内存中,您需要“无限-c”。只需在shell提示符下输入"ulimit“,就可以找到当前的ulimits。然后重新运行你的崩溃程序。获得核心文件后,在其上运行GNU调试器。
gdb program.exe corehttps://stackoverflow.com/questions/23874667
复制相似问题