Intereting Posts
сканирование из входного файла в C до достижения определенного символа (#)? Чтение карты NFC Mifare с помощью библиотеки NXP Reader Имя c idiom – `static void * thing = & thing;` Является ли также декларатором (при использовании в объявлении параметра) в C? C строк из текстового файла Макросцифровывать и распределять данные для членов структур неправильно распознает элемент struct как указатель Почему производительность cgo настолько медленная? что-то не так с моим тестовым кодом? проблема в сканировании в C передача целочисленных аргументов при использовании execve realloc, но только первые несколько байтов имеет смысл Как сделать тип возвращаемого массива функцией C? Ошибка во время кросс-компиляции кода C с помощью динамических библиотек Возвращаемый аргумент не работает – дает мне странную ошибку Функции Matlab gamfit и gampdf, написанные на C ++ Как преобразовать String в int в C

getchar и putchar

Мой код C:

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

Почему эта программа так реагирует на ввод hello ?

 hello hello 

и не нравится:

 hheelloo 

Ваш вход hello а не прав?

Таким образом, вводимый вами ввод буферизуется, пока вы не нажмете enter .

Когда вы печатаете, консоль захватывает выходные данные с клавиатуры, повторяя ее обратно.

getchar() работает с входным streamом, который обычно настраивается с включенным «Canonical input». Такая конфигурация уменьшает затраты времени процессора на опрос ввода для схемы буферизации, где вход буферизуется, до тех пор, пока не произойдут определенные события, которые сигнализируют о расширении буфера. Нажатие клавиши ввода (и управление D) приводит к сбросу этого буфера.

 #include  int main(void){ int c; static struct termios oldt; static struct termios newt; /* Fetch the old io attributes */ tcgetattr( STDIN_FILENO, &oldt); /* copy the attributes (to permit restoration) */ newt = oldt; /* Toggle canonical mode */ newt.c_lflag &= ~(ICANON); /* apply the new attributes with canonical mode off */ tcsetattr( STDIN_FILENO, TCSANOW, &newt); /* echo output */ while((c=getchar()) != EOF) { putchar(c); fflush(STDOUT_FILENO); } /* restore the old io attributes */ tcsetattr( STDIN_FILENO, TCSANOW, &oldt); return 0; } 

Возможно, ваш терминал только записывает ваш ввод в stdin, когда вы нажимаете enter. Попробуйте ввести что-то, вернуться и написать что-то еще; если вы не видите первоначально введенные символы, это означает, что ваш терминал ожидает, что вы составите строку перед отправкой данных в программу.

Если вам нужен доступ к исходному терминалу (например, реагировать на нажатие клавиш и нажатие клавиши), вы должны попробовать некоторую терминальную библиотеку, такую ​​как ncurses .

Стандартные streamи ввода / вывода могут быть буферизованы, что означает, что ваш вход может не отображаться на экране до тех пор, пока не встретится символ пробела (например).

Поскольку значение по умолчанию для stdin когда оно относится к клавиатуре, должно быть привязано к строке.
Это означает, что вы видите только полные строки, а не отдельные символы.

Представьте, что вы спросите своего друга, какой у него номер телефона … но он должен записать его на листе бумаги. Вы не получаете цифры по цифрам, как он их пишет: вы получаете весь номер, когда он дает вам кусок бумаги 🙂

getchar считывает входные данные из входного streamа, который доступен только после нажатия клавиши ENTER. до тех пор вы видите только эхо-результат с консоли. Чтобы достичь результата, который вы хотите, вы можете использовать что-то вроде этого

 #include  #include  #include  int getCHAR( ) { struct termios oldt, newt; int ch; tcgetattr( STDIN_FILENO, &oldt ); newt = oldt; newt.c_lflag &= ~( ICANON | ECHO ); tcsetattr( STDIN_FILENO, TCSANOW, &newt ); ch = getchar(); putchar(ch); tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); return ch; } void main() { int c; c = getCHAR(); while (c != 'b') { putchar(c); c = getCHAR(); } }