ranaarjun - 1 year ago 61
C Question

# Store data in array from input

I'm beginner in C. Please dont mind if my question is lame. In this program which i have written, when I use 'for' loop first time , I expect only 3 values is stored in an array but it stores 4 values and in next 'for' loop as expected show 3 values.
My Question is why in 1st 'for' loop it takes 4 values instead of 3?

``````#include<stdio.h>
void main()
{
int marks[3];
int i;

for(i=0;i<3;i++)
{
printf("Enter a no\n");
scanf("%d\n",(marks+i));
}
for(i=0;i<3;i++)
{
printf("%d\n",*(marks+i));
}
}
``````

`\n` in `scanf` was the problem

``````#include<stdio.h>
int main()
{
int marks[3];
int i;

for(i=0;i<3;i++)
{
printf("Enter a no\n");
scanf("%d",(marks+i));
}

printf("\nEntered values:\n");
for(i=0;i<3;i++)
{
printf("%d\n",*(marks+i));
}

return 0;
}
``````

Reason:

I expect only `3` values is stored in an array but it stores 4 values and in next 'for' loop as expected show 3 values. My Question is why in 1st 'for' loop it takes 4 values instead of 3?

First: No, it only stores `3` number but not `4` numbers in array `marks[]`.

Second: interesting to understand loop runs only for three times for `i = 0` to `i < 3`. The for loop runs according to condition. More interesting code is stuck in `scanf()` as described below:

Your confusion is why you have to enter four numbers, its not because you loop runs `4` times but its because `scanf()` function returns only when you enter a non-space char (and after some enter press you inputs a number symbol that is non-space char).

To understand this behavior read manual: `int scanf(const char *format, ...);`:

A sequence of white-space characters (space, tab, newline, etc.; see `isspace(3)`). This directive matches any amount of white space, including none, in the input.

Because in first for loop's, in `scanf()` you have included `\n` in format string, so `scanf()` returns only if press a number enter (or a non-space key).

`````` scanf("%d\n",(marks+i));
^
|
new line char
``````

What happens?

Suppose input to program is:

``````23        <--- because of %d 23 stored in marks[0] as i = 0
<enter>   <--- scanf consumes \n, still in first loop
543       <--- scanf returns, and leave 542 unread,
then in next iteration 543 read by scanf in next iteration
<enter>
193
<enter>  <--- scanf consumes \n, still in 3rd loop
<enter>  <--- scanf consumes \n, still in 3rd loop
123      <--- remain unread in input stream
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download