首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fscanf()函数的分割故障

fscanf()函数的分割故障
EN

Stack Overflow用户
提问于 2014-05-26 16:53:29
回答 1查看 882关注 0票数 0

我正在为一个C字词搜索程序编写一些代码,在编译其中一个文件时,我得到了fscanf函数的分段错误,但我不知道错误在哪里。我已经搜索了答案,并且我了解到,对于整数变量,我必须初始化它们的值(而且我已经完成了),并且我必须用'&‘(也是这样)引用fscanf()中的类型。

下面是代码(在main()函数中):

代码语言:javascript
复制
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‘文件:

代码语言:javascript
复制
3 3
SIA
ORR
EDI
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-26 17:01:13

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

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

然后决定为什么fopen()失败。我建议打印出文件,或者检查它是否存在,并/或使用perror()打印系统错误。perror()会告诉您到底出了什么问题,如果我不得不猜测的话,就像@BLUEPIXY所提到的那样,文件名中的一个换行符。

代码语言:javascript
复制
stream = fopen(buffer,"r");
if(!stream) {
    perror("what the problem: "); 
}

最后,学习如何使用调试器来分析核心文件。如果您没有得到一个核心转储,设置您的ulimit正确。从内存中,您需要“无限-c”。只需在shell提示符下输入"ulimit“,就可以找到当前的ulimits。然后重新运行你的崩溃程序。获得核心文件后,在其上运行GNU调试器。

代码语言:javascript
复制
gdb program.exe core
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23874667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档