Путаница в использовании функции putchar () в C - PullRequest
0 голосов
/ 06 августа 2020

Я изучаю C из книги «Язык программирования C». В этом случае, когда он вводил функцию putchar () с использованием следующего кода:

#include<stdio.h>
/* program to copy its input to its
   output, one character at a time
   using assignment inside while loop */

    int main()
    {
            int c;
            while((c=getchar()) != EOF)
                    putchar(c);
    }

Первоначально я думал, что если я хочу ввести '123 \ n' и для этого, когда я нажимаю клавишу '1', тогда в терминале '11' будет виден мне, поэтому после нажатия клавиш '2' и '3' я подумал, что терминал покажет '112233', и когда я наконец нажму 'Enter', появятся две новые строки . Но я был неправ, и ввод был напечатан только тогда, когда я нажал «ввод» или «EOF».

В книге была еще одна проблема - напечатать те строки, длина которых превышает 80 символов. Я написал следующий код, надеясь, что он сработает:

    #include<stdio.h>

int main()
{
        int c, nc=0;
        while((c=getchar())!=EOF)
        {
                ++nc;
                if(c=='\n')
                {       
                        if(nc > 80)
                                putchar(c);
                        nc=0;
                }
        }
}

Но это не работает.

В первом коде, когда я нажимаю «Enter», он печатает всю строку, во втором коде я хотел подсчитать символы, и когда я нажимаю «Enter», мой код проверяет, превышает ли количество символов 80 или нет, а если больше 80, то я сделал «putchar (c)». Почему это не работает?

Пожалуйста, поясните, что я не прошу решения проблемы в книге. Меня смущает вывод putchar (), пожалуйста, развейте мои сомнения.

1 Ответ

0 голосов
/ 06 августа 2020

Существуют две вещи, которые могут повлиять на то, когда символы ввода доступны для getchar():

  1. Если стандартная библиотека C обнаруживает, что стандартный поток поток не подключено к «интерактивному устройству» (например, не подключено к окну терминала), он установит для потока режим полной буферизации , в противном случае будет установлено строчная буферизация режим. (То же самое верно для потока стандартный вывод , но для потока стандартной ошибки не будет установлен режим полной буферизации.) (См. C11 7.21.3p3 Режим буферизации потока можно изменить с помощью функций setvbuf() или setbuf(). (В некоторых системах есть дополнительные функции, но обычно они представляют собой просто оболочки вокруг `setvbuf ().)

  2. Если стандартный ввод поступает с терминала POSIX, он обычно будет установлен в режим канонический ввод , что означает, что ввод доступен для чтения построчно. Для POSIX term ios можно изменить, чтобы перевести терминал в неканонический режим ввода, в котором ввод можно читать посимвольно. (Microsoft Windows console windows имеет SetConsoleMode для аналогичных настроек.) Эти функции работают ниже уровня C потоков.

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