Почему этот код C имеет неожиданное поведение - PullRequest
0 голосов
/ 09 марта 2012

Я написал следующий простой C-код, который компилируется и работает нормально.Однако это ведет себя так, что я не понимаю.Я набираю символ, он печатает его на экране.Но , когда я нажимаю клавишу возврата, она печатает всю строку .Поэтому, если я наберу буквы a, b и c, abc будет напечатан в командной строке дважды.ПОЧЕМУ это делает?

#include <stdio.h>


int main(){


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

return 0;

}

Ответы [ 4 ]

5 голосов
/ 09 марта 2012

Потому что ваш терминал имеет линейную буферизацию.

Он не отправляет данные в вашу программу, пока не встретит символ новой строки, хотя он выведет символ на экран, чтобы вы могли видеть, что они нажимают клавишу.

4 голосов
/ 09 марта 2012

Это ваш терминал, а не программа.

Когда вы нажимаете клавишу, ваш терминал печатает ее, но не передает ее программе.

Когда вы нажимаете ввод,терминал передает всю строку в программу, и программа печатает строку.

РЕДАКТИРОВАТЬ: если вы используете Unix / Linux / etc, вы можете написать stty -icanon -echo, чтобы отключить это поведение терминала.-echo отключает печать, а -icanon отключает буферизацию.

0 голосов
/ 09 марта 2012

Вы читаете из стандартного входного потока, который буферизован строкой.

Попробуйте этот альтернативный код, и вы лучше поймете, что происходит:

#include <stdio.h>
int main(){
    int c;
    while((c=getchar())!=EOF){
        printf("got char %c\n", c);
    }
    return 0;
}

Вам нужно не-линейный буферный ввод.Это будет зависеть от вашей платформы, но вот ответ для Linux: чтение буфера без буферизации

0 голосов
/ 09 марта 2012

То, что вы видите, представляет собой комбинацию из нескольких вещей.

  1. Когда вы печатаете символ, если вы явно не остановите его, он выводится на экран.
  2. Большинство операторов print на самом деле ничего не печатает до тех пор, пока не будет напечатана новая строка.

Таким образом, текст, который вы видите, поступает из команд типа, но напечатанная строка putchar () выполняетсясразу.

...