функция 'getchar' в c

avatar
Sayem Rahman
3 августа 2021 в 10:19
137
2
0
#include <stdio.h>

int main() {
    int n = 6;
    while (n--){
        int c = getchar();
        printf("%c",c);
    }   
    return 0;
}

может ли кто-нибудь объяснить приведенный выше код? например, если я ввожу что-то вроде этого

99999

Я получаю такой вывод

99999

но я нажал "Enter" после того как дал пять девяток, но как читаются все девятки? Я имею в виду, что если я использую scanf, мне нужно нажимать ввод после каждого ввода, но я не делал этого там, я присваиваю возвращаемое значение getchar переменной int, она не может хранить пять целых чисел вместе, так как же работает функция getchar читать все пять девяток вместе?

Источник
Weather Vane
3 августа 2021 в 10:23
2

Потому что все 5 девяток присутствуют во входном буфере и доступны для чтения программой после нажатия <Enter>. То же самое верно и для scanf - новая строка не обязательно требуется после каждого элемента, только для завершения последовательности.

stark
3 августа 2021 в 10:58
0

Также проще использовать putchar.

phuclv
3 августа 2021 в 11:08
0

Отвечает ли это на ваш вопрос? Как %c и %s работают в языке C?

phuclv
3 августа 2021 в 11:09
0

прочитать документацию %c

phuclv
3 августа 2021 в 11:55
0

и getchar

Ответы (2)

avatar
Vlad from Moscow
3 августа 2021 в 10:41
0

Если вы будете запускать эту демонстрационную программу

#include <stdio.h>

int main( void ) 
{
    size_t n = 6;
    
    while ( n-- )
    {
        int c = getchar();
        printf( "%c", c );
    }
    
    n = 6;
    
    while ( n-- )
    {
        char c;
        scanf( "%c", &c );
        printf( "%c", c );
    }
    
    
    return 0;
}

и два раза введите последовательность

99999

и после каждого нажатия клавиши Enter вы получите одинаковые результаты для обоих циклов while

99999
99999

Это оба вызова

int c = getchar();

и

scanf( "%c", &c );

прочитает последовательно цифры 9 и после них прочитает символ новой строки '\n'.

Заметная разница между использованием getchar и scanf для чтения символов заключается в том, что вы можете пропустить чтение пробелов, используя scanf, вставив пробел в строку формата, например,

scanf( " %c", &c );
       ^^^^^

Если вы сделаете это изменение в демонстрационной программе выше и введете последовательность

9
9
9
9
9
9
9

тогда вывод программы будет

9
9
9
999999
avatar
Serge Ballesta
3 августа 2021 в 10:30
2

На самом деле это связано не с языком C, а с операционной системой и подсистемой ввода-вывода.

По умолчанию вывод терминала ориентирован на строку, что означает, что низкоуровневая система (драйверы и/или системные подпрограммы) буферизует то, что печатается на клавиатуре, и предоставляет данные программе только после завершения строки (возврат каретки или Перевод строки дан).

В Unix-подобных системах (Linux, ...) вы можете установить терминал в необработанный режим с помощью stty raw, чтобы ваша программа на C могла обрабатывать по одному символу за раз, как только он будет набран. Но остерегайтесь неприятных побочных эффектов, таких как требование Ctrl J для ввода новой строки...