" Разве перевод строки не должен выводиться один раз i == 10
? "
Нет. Поскольку консольный ввод по умолчанию буферизирован. getchar()
не вернет следующий символ в stdin
, пока не будет найден символ новой строки '\n'
в stdin
. Новая строка требуется для sh буфера.
Существуют решения, основанные на реализации, которые позволяют пропустить sh ввод немедленно, не дожидаясь новой строки. Например, getche()
в conio.h под Windows / DOS или вариант cbreak()
и использование getch()
вместо getchar()
в curses -library для Linux.
Также ваш подсчет неверен, с i = 0;
и if (i == MAXLINE)
после 11 символов будет помещена новая строка, а не после 10. Это потому, что вы начинаете с 0
, а не 1
. Вместо этого используйте i = 1
или if (i == (MAXLINE - 1))
.
Если вы работаете в Windows / DOS, попробуйте:
#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);
}
Если сброс счетчика затруднен для понимания вы, приведенный выше код в основном эквивалентен:
#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);
}
Для Linux используйте cbreak()
и getch()
из библиотеки ncurses:
#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();
}
Примечание. Чтобы использовать библиотеку ncurses, вам необходимо добавить параметр -lnurses
при вызове компилятора.
Кроме того, вам нужно использовать initscr()
и endwin()
для открытия и закройте окно терминала curses.