I am learning to program in C
. Could you explain why nothing is printed here?
#include <stdio.h>
int main (void)
{
char a[]="abcde";
printf ("%s", a);
}
I am learning to program in C
. Could you explain why nothing is printed here?
#include <stdio.h>
int main (void)
{
char a[]="abcde";
printf ("%s", a);
}
On many systems printf
is buffered, i.e. when you call printf
the output is placed in a buffer instead of being printed immediately. The buffer will be flushed (aka the output printed) when you print a newline \n
.
On all systems, your program will print despite the missing \n
as the buffer is flushed when your program ends.
Typically you would still add the \n
like:
printf ("%s\n", a);
An alternative way to get the output immediately is to call fflush
to flush the buffer. From the man page:
For output streams, fflush() forces a write of all user-space buffered data for the given output or update stream via the stream's underlying write function.
Source: http://man7.org/linux/man-pages/man3/fflush.3.html
EDIT
As pointed out by @Barmar and quoted by @Alter Mann it is required that the buffer is flushed when the program ends.
Quote from @Alter Mann:
If the main function returns to its original caller, or if the exit function is called, all open files are closed (hence all output streams are flushed) before program termination.
Hopefully, I can make a couple of points about this without making it confusing. Printf is not the thing being buffered, it's stdio, so all similar functions will behave in the same way. To demonstrate the buffering, all you have to do is printf a lot of characters, usually more than 1024, and printf will print as you will have exceeded the maximum buffer length and it will automatically fflush. All the other points are, of course, also correct and valid.
Doing a fflush()
could be expensive if you also have other streams other than stdout
open for write, like say a file outputting to disk. Running fflush()
will flush all streams not just stdout. It would be better to be more specific and pass the stream to flush. So for printf() which outputs to stdout
you'd use fflush(stdout)
. A alternative if you're looking to output errors would be to use stderr
as that's unbuffered with fprintf()
.
Also you can use setvbuf
to change an open streams buffer before writing to it. See man setvbuf