Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C program output in wrong order Eclipse

Tags:

c

eclipse

I have set up Eclipse for c programming on my Windows machine, I have successfully run a "hello, world" program. However, when I try to ask for user input and run the program the console on Eclipse is displaying in the wrong order.

Here is what I have

    #include <stdio.h>

    int main(void){

         char letter;

         printf("Please enter a letter:\n");
         scanf(" %c, &letter);
         printf("The letter you have selected is: %c", letter);

         return 0;
    }

This program builds just fine, and it runs just fine outside of Eclipse. But when I run it in Eclipse I get the output:

E <--- (this is my user input)

Please enter a letter:

The letter you have selected is: E

I'm not sure why the output is executing in the wrong order, so any help would be much appreciated! Thank you.

like image 549
nland Avatar asked Dec 21 '22 04:12

nland


1 Answers

Yeah, Eclipse will buffer a certain amount of output (I don't remember how much off hand) before it will appear in the output window. Eclipse is communicating with the attached process through a pipe which is fully buffered. It won't flush until either fflush() is called or the buffer is full. I found that when debugging with Eclipse, things work best if I put the following near the beginning of my application:

setvbuf(stdout, NULL, _IONBF, 0);

This will cause stdout to flush immediately whenever it is written to. If you want to use that for debugging and turn it off otherwise, you can conditionally compile it:

#ifdef DEBUG
setvbuf(stdout, NULL, _IONBF, 0);
#endif

No need to put fflush() everywhere this way.

Edit

Here's where I found the solution when I first ran into this issue myself.

http://wiki.eclipse.org/CDT/User/FAQ#Eclipse_console_does_not_show_output_on_Windows

Eclipse's console is not a true console or terminal but rather eclipse is communicating with the attached process through a pipe which is fully buffered not line buffered. This is why a newline '\n' does not cause the buffer to be flushed.

like image 73
Dave Rager Avatar answered Jan 04 '23 11:01

Dave Rager