user3676951
user3676951

Reputation: 41

Segmentation fault in fscanf() function

I am writing some code for a C wordsearch program and, while compiling one of the files, i get segmentation fault on fscanf function but i don't know where the error is. I already searched for the answer and i understood that on integer variables I must initialize the value of them (and I already done it) and that i must refer the types inside fscanf() with '&' (done it too).

Here is the code( in the main() function):

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);
}
}

I wanted 'nl' (number of lines) to read 3 and 'nc' (number os columns) to read the other 3.

The 't01.in' file:

3 3
SIA
ORR
EDI

Upvotes: 0

Views: 1020

Answers (1)

mrjoltcola
mrjoltcola

Reputation: 20842

Anytime you open an external resource (file, database, socket), or make any system call whatsoever, you always check for a valid stream or return code.

The first thing you should do is add a check for stream instead of blindly calling fscanf(stream,...) without knowing if the fopen() call succeeded.

Then decide why fopen() failed. I suggest printing out the filenamne, or checking that it exists, and/or using perror() to print the system error. perror() will tell you exactly what is wrong, and if I had to guess, it would be as @BLUEPIXY mentioned, a newline in the filename.

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

Lastly, learn how to use the debugger to analyze the core file. If you aren't getting a core dump, set your ulimit correctly. From memory, you want "ulimit -c unlimited". Find out your current ulimits by typing simply "ulimit" at the shell prompt. Then re-run your crashing program. Once you get a core file, run GNU debugger on it.

gdb program.exe core

Upvotes: 2

Related Questions