簡體   English   中英

fscanf()函數中的分段錯誤

[英]Segmentation fault in fscanf() function

我正在為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);
}
}

我想讓“ nl”(行數)讀取3,而讓“ nc”(行數os列)讀取其他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無限制”。 在shell提示符下鍵入“ ulimit”,找出當前的ulimit。 然后重新運行您的崩潰程序。 獲得核心文件后,在其上運行GNU調試器。

gdb program.exe core

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM