"Shouldn't a newline be outputted once i == 10
?"
No. Because the console input is buffered by default. getchar()
will not return the next character in stdin
before it found a newline character '\n'
in stdin
. The newline is required to flush the buffer.
There are implementation-based solutions possible to flush the input immediately and not waiting for the newline. For example getche()
in conio.h under Windows/DOS or the cbreak()
option and using getch()
instead of getchar()
in the curses-library for Linux.
Also your counting is incorrect, with i = 0;
and if (i == MAXLINE)
after 11 characters will a newline be placed in the output, not after 10. This is because you start at 0
, not 1
. Use either i = 1
or if (i == (MAXLINE - 1))
instead.
If you are on Windows/DOS, try:
#include <stdio.h>
#include <conio.h> // Necessary to use getche().
#define MAXLINE 10
// count number of chars, once it reaches certain amount
int main (void)
{
int i, c;
for (i = 0; (c = getche()) != EOF; i++)
{
if (i == (MAXLINE - 1))
{
printf("\n");
i = -1; // Counter is reset. To break out of the loop use CTRL + Z.
}
}
//printf("%d\n",i);
}
If the counter reset is a bit hard to understand for you, the code above is basically equivalent to:
#include <stdio.h>
#include <conio.h> // Necessary to use getche().
#define MAXLINE 10
// count number of chars, once it reaches certain amount
int main (void)
{
int i, c;
for (i = 1; (c = getche()) != EOF; i++)
{
if (i == MAXLINE)
{
printf("\n");
i = 0; // Counter is reset. To break out of the loop use CTRL + Z.
}
}
//printf("%d\n",i);
}
For Linux use the cbreak()
and getch()
from the ncurses-library:
#include <stdio.h>
#include <ncurses.h>
#define MAXLINE 10
// count number of chars, once it reaches certain amount
int main (void)
{
cbreak();
echo();
initscr();
int i, c;
for (i = 1; (c = getch()) != ERR; i++)
{
if (i == MAXLINE)
{
printf("\n");
refresh();
i = 0; // Counter is reset. To break out of the loop use CTRL + D.
}
}
//printf("%d\n",i);
endwin();
}
Note: To use the ncurses-library, you need to add the -lnurses
option at invoking the compiler.
Furthermore, you need to use initscr()
and endwin()
to open and close the curses terminal window.