Как свернуть ввод при достижении максимального количества символов? - PullRequest
3 голосов
/ 26 мая 2020

Я работаю над проблемой из книги программирования C ansi. Я прошу пользователя ввести данные, пока не будет конца строки. Однако я бы хотел, чтобы символы перемещались на следующую строку после того, как были достигнуты 10 символов. Однако символ новой строки работает только после нажатия клавиши ввода. Разве после i == 10 не должна выводиться новая строка?

#include <stdio.h>
#define MAXLINE 10


// count number of chars, once it reaches certain amount

int main() 
{
    int i,c;

    for (i=0;(c=getchar()) != EOF; i++)
    {
        if (c == '\n'){
            i = 0;
        }

        else if (i == MAXLINE){
            printf("\n");
        }

    }
    //printf("%d\n",i);

}

Спасибо.

1 Ответ

1 голос
/ 26 мая 2020

" Разве перевод строки не должен выводиться один раз 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...