Using fgets
to input a string, I have doubts related to length of string read.
For example, consider the following program.
char str[50];
int i;
int len;
printf("Enter name:\n");
fgets(str,11,stdin);
len = strlen(str);
printf("len : %d\n",len);
If I enter
123456789
,strlen
gives 10.If I enter
1234567890
,strlen
given is 10 again ??
I think strlen
is considering newline also for string length. Am I correct?
(I understand fgets
using newline as part of string)
What's wrong with (2) where I enter exactly 10 characters, Here string length should be 11 right? 10 + 1 (for newline) = 11
fgets
reads at most 1 fewer characters than the length argument given, and does retain the newline as part of the input - so long as the newline is part of the first (length - 1) characters.So in your first case, assuming that
123456789
is followed by a newline,fgets
has read 9 characters including the newline, yielding a string length of 10; in your second case,fgets
will stop after reading the 10 characters1234567890
, yielding a string length of 10.Here is an example:
Sample output, with "MAX_DIGITS" and "MAX_DIGITS + 1":
You'll notice:
The return buffer retains the "\n" as long as the #/digits are < MAX_DIGITS.
The "\n" is REMOVED when #/digits >= MAX_DIGITS.
Your buffer must accomodate MAX_DIGITS+1
Actually
fgets
requires asize
specification (in your case11
) account for the\0
at the end of a string. From thefgets
man page:So we know that reading stops at
\n
, when you enter123456789\n
. However when you enter1234567890\n
,fgets()
processes the input but it only takes the 10 characters and ignores everything else afterwards.Any extra input of your string and your string will at
size-1
offget()
with last character as\0
so the output remains the same.