Difference between scanf() and fgets()

70,349

Solution 1

There are multiple differences. Two crucial ones are:

  • fgets() can read from any open file, but scanf() only reads standard input.
  • fgets() reads 'a line of text' from a file; scanf() can be used for that but also handles conversions from string to built in numeric types.

Many people will use fgets() to read a line of data and then use sscanf() to dissect it.

Solution 2

int scanf(const char * restrict format, ...);

scanf(3) searches for certain pattern defined by the format argument on the given input known as stdin, where the pattern is defined by you. The given input to scanf(3), depending on its variant (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf), could be a string or a file.

char *fgets(char * restrict str, int size, FILE * restrict stream);

fgets(3) just reads a line from the input file stream and copy the bytes as null terminating string to the buffer str and limit the output to the buffer to given bytes in size.

Solution 3

Scanf does not perform bounds checking. fgets is likely going to be the better choice. You can then use sscanf() to evaluate it.

Good discussion of the topic here- http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

How do you allow spaces to be entered using scanf? (That was my evil twin getting lectured for forgetting this- not me)

Solution 4

It should be noted that scanf pattern specs do allow field width limits:

scanf( " %80s", mybuffer );

But, where printf() allows the width to be passed as a variable (with '*'):

printf( "My name is %*s.\n", 20, name );

scanf() does not. (It interprets the '*' as a flag to suppress/ignore the field entirely.) Which means you end up doing things like this:

#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );

and no way to connect the field width 40 in the scanf() with the buffer width 40 in the buffer declaration.

Solution 5

scanf parses a string you read in (or created), and fgets reads a line from an open FILE*. Or do you mean fscanf?

Share:
70,349
Biswajyoti Das
Author by

Biswajyoti Das

I am doing my bachelors in Computer science and engineering .

Updated on December 28, 2020

Comments

  • Biswajyoti Das
    Biswajyoti Das over 3 years

    I want to know what is the difference between fgets() and scanf(). I am using C as my platform.

  • Jonathan Leffler
    Jonathan Leffler almost 15 years
    For numeric types, scanf() does not need to do bounds checking. For string types, you can tell scanf() to do boundary checking.