2015-11-14 2 views
-1
#include <stdio.h> 
void main() 
{ 
    int c; 
    c = getchar(); 

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


} 

В приведенном выше коде я понимаю, что putchar (c) печатает первый символ строки, хранящейся в переменной c. Однако я не понимаю, как можно напечатать всю строку, когда putchar (c) помещается внутри этого цикла while. Как условие c! = EOF увеличивает индекс строки c? Как c = getchar() снаружи, в то время как цикл отличается от цикла в теле цикла?Символ IO в C

+1

Нет * целая строка *. 'getchar()' получает один символ за раз; петля выводит это 'char', а затем извлекает другую. ('c' должен быть объявлен как' char', потому что функция 'getchar()', а не 'getint()', BTW.) –

+2

@KenWhite no, 'getchar()' возвращает 'int', потому что' EOF 'является' int', и вам нужно проверить его. – Kevin

+1

@KenWhite, функция: 'getchar()' возвращает 'int', поэтому код верен. – user3629249

ответ

2

Поведение, которое «печатает всю строку» после нажатия Enter, связано с тем, что stdout (стандартный вывод) буферизирован. Если он не будет буферизирован, каждый введенный вами символ будет напечатан немедленно (дублируя ваш ввод).

+1

1) более вероятно, что «эхо» включено, поэтому каждый символ сразу отображается на терминале. 2), когда производится выход, а затем вход (stdout/stdin), выходной буфер очищается до ввода. 3) цикл также является эхом любого символа новой строки (от пользователя, нажимающего клавишу «return/enter»), потому что вызов getchar() будет извлекать что-либо во входном потоке, включая ключ «enter». Тем не менее, Примечание: * программа ничего не видит, пока пользователь не нажмет клавишу «ввести/вернуть» * – user3629249

+0

@ user3629249 Да, но это потому, что вход терминала также буферизирован по строке, независимо от того, что получает 'stdin'. – nnn

+0

В действительности, терминал ввода/вывода «приготовлен». Если вы хотите, чтобы приложение получило символы без необходимости нажатия на кнопку «enter», измените режим ввода-вывода терминала на «raw». Но тогда приложение должно будет обрабатывать все клавиши управления и клавиши редактирования и т. Д. И т. Д. – user3629249

1

Фактически c просто хранит один символ. Программа считывает один входной символ за раз и печатает его по одному символу за раз, пока не будет больше ввода.

Я добавил некоторые комментарии в коде, так что вы можете увидеть, что он делает:

int c; 
    c = getchar(); //get a new character from input and store in c. 
    while(c != EOF) // while the current character is not an End Of File 
    { 
     putchar(c); // print the current character 
     c = getchar(); // fetch the next character from input 
    } 
3

c != EOF делает не увеличиваем индекс строки из c. stdin - входной буфер. Вы читаете от stdingetchar) и записываете stdoutputchar). Когда вы вызываете getchar(), однозначный номер считывается с stdin, а указатель файла-файла для stdin - продвинутый по одному (следующему символу).

Когда вы читаете символ из stdin (отстаивание к следующему символу) и писать один символ stdoutв цикле, вы потребляете все символы stdin один-на-один, пока не достигнете EOF для stdin (т.е. вас прочитали все символы, доступные во входном буфере)

0

В вашей программе есть две операции ввода-вывода: (1) c = getchar(), которая считывает следующий символ из стандартного ввода и сохраняет его в c и (2) putchar(c), который пишет символ c для стандартного вывода. Если вы вызываете из окна терминала без перенаправления, то стандартный ввод (stdin) и стандартный вывод (stdout) будет просто вашим терминальным окном (в этом случае вам нужно будет ввести соответствующий символ EOF для вашей системы. перенаправляются в/из файла или трубы

Обратите внимание, что «классический» способ, чтобы написать это, чтобы встроить getchar назначение в while тест:.

while ((c = getchar()) != EOF) 
    putchar(c); 

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