Где делает 'getchar ()', хранят ввод данных пользователем?

Большинство людей используют Microsoft Visual Studio для разработки под Windows. Вы можете получить бесплатную версию здесь: http://www.microsoft.com/express/download/ .

Обычно GCC используется в Unix и обычно входит в состав ОС.

C и C ++ очень похожи, но C ++ допускает классы. Большинство компиляторов C ++ будут компилировать код C.

7
задан Deduplicator 23 January 2015 в 11:20
поделиться

6 ответов

Он обрабатывает входной поток как файл. Это как если бы вы открыли файл, содержащий текст «toomanychars», и прочитали или вывели его по одному символу за раз.

В первом примере при отсутствии цикла while это как если бы вы открыли файл и прочитали первый символ, а затем вывести его. Однако второй пример будет продолжать читать символы до тех пор, пока не получит сигнал конца файла ( ctrl + D в вашем случае), как если бы он читал из файла на диске.


В ответ на ваш обновленный вопрос, какую операционную систему вы используете? Я запустил его на своем ноутбуке с Windows XP, и он работал нормально. Если я нажму Enter, он распечатает то, что у меня было, создаст новую строку, а затем продолжит. (Функция getchar () не возвращается, пока вы не нажмете клавишу ввода, когда при его вызове во входном буфере ничего нет). Когда я нажимаю CTRL + Z (EOF в Windows), программа завершается. Обратите внимание, что в Windows EOF должен находиться в отдельной строке, чтобы считаться EOF в командной строке. Я не знаю, имитируется ли такое поведение в Linux или какой-либо другой системе, в которой вы работаете.

5
ответ дан 6 December 2019 в 07:27
поделиться

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

3
ответ дан 6 December 2019 в 07:27
поделиться

getchar получает один символ из стандартного ввода, которым в данном случае является буфер клавиатуры.

Во втором примере функция getchar является в цикле while , который продолжается до тех пор, пока он не встретит EOF , поэтому он будет продолжать цикл и извлекать символ (и выводить символ на экран), пока ввод не станет пустым.

Последовательные вызовы getchar будут получать последовательные символы, поступающие из ввода.

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

9
ответ дан 6 December 2019 в 07:27
поделиться

Что-то здесь находится в буфере. например, ФАЙЛ * stdout, в который пишет putchar, может быть line.buffered. Когда программа завершится (или встретит новую строку) такой ФАЙЛ * будет fflush () 'ed, и вы увидите результат.

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

Теперь, что, вероятно, будет реальным случаем здесь, так это то, что это ввод, который буферизуется (в дополнение к выводу :-)) Когда вы нажимаете клавиши, это ' появится в окне вашего терминала. Однако терминал не будет отправлять эти символы в ваше приложение, он будет буферизовать их, пока вы не укажете, что это конец ввода с помощью Ctrl + D, и, возможно, также новую строку. Вот еще одна версия, над которой можно поиграть и поразмышлять:

int main() {
  int c;
   while((c = getchar()) != EOF) {
     if(c != '\n')
        putchar(c);
   }
    return 0;
}

Попробуйте скормить своей программе предложение и нажмите Enter. И сделайте то же самое, если закомментируете if (c! = '\ n') Может быть, вы можете определить, буферизированы ли ваш ввод, вывод или и то, и другое. Это станет более интересным, если вы запустите приведенное выше, например: ./mytest | ./mytest

( В качестве дополнительного комментария обратите внимание, что CTRD + D не является символом и не является EOF. Но в некоторых системах это приведет к закрытию входного потока, что снова вызовет EOF для всех, кто пытается прочитать из поток.) ​​

4
ответ дан 6 December 2019 в 07:27
поделиться

код функционально эквивалентен

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

, возможно, вам будет легче понять эту версию. единственная причина поместить присвоение в условное выражение - избежать необходимости дважды вводить c = getchar ().

1
ответ дан 6 December 2019 в 07:27
поделиться

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

После отображения первого символа ( t ) с помощью putchar (c) , вы забываете о значении c , назначая следующий символ ( o ) в переменную c , заменяя предыдущее значение ( t ).

2
ответ дан 6 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: