Вопросы по программированию на C (новичок) [закрыто]

Я прочитал книгу Kernighan & Ritchie по программированию на C и у меня есть несколько вопросов о 'getchar' и 'putchar'.

  1. Вопрос находится ниже примера кода:

    #include 
    int main(void) {
     int c;
     c = getchar();
     while(c != EOF) {
     putchar(c);
     c = getchar();
     }
     return 0;
    }
    

Когда я запускаю этот код в терминале и ввожу символ (например, 'i'), а затем нажимаю Enter, он печатает введенный символ:

i // введенный символ
i // напечатанный символ

После этого он предлагает мне ввести другой символ. Если я ввожу другой символ, процедура повторяется. Если я нажимаю Ctrl-D (EOF) вместо ввода другого символа, программа завершается. Первый вопрос - почему, когда я запускаю этот код и после ввода символа ('i') не нажимаю Enter, а нажимаю Ctrl-D, он печатает введенный символ и печатает его таким образом:

ii // первый символ введен, второй печатается после Ctrl-D

Поэтому для завершения программы мне нужно снова нажать Ctrl-D.

  1. Почему в коде выше я могу ввести слово и он печатает слово, а в коде ниже он печатает только один символ, даже если я ввел слово? Код:

    #include 
    
    int main(void) {
     int c;
    
     printf("Введите символ:\n");
     c = getchar();
     printf("Введенный символ:\n");
     putchar(c);
     printf("\n");
    
     return 0;
    }
    

Буду благодарен за любую помощь.

-3
задан 1 December 2014 в 05:38

1 ответ

Как правило для входа в C, это обычно работает в строках - то есть, он буферизуется. Это означает, что что-либо, что Вы вводите, на самом деле не отправляется в программу, пока Не Входят, нажимается. Так, для первой программы это просто ожидает (также названный "блокированием") в getchar() запрос до строки данных входит. Поэтому это на самом деле не видит ничего, что это вводится, пока целая строка не отправляется.

Строка отправляется в форме "Этого, строка [EOF]" (где [EOF] является литеральным символом EOF, как определено временем выполнения C). Цикл в первой программе работает несколько как/в то время как конструкция путем простого захвата символов по одному от буфера и печати их до конца. Как Вы знаете, Ctrl+D является синонимом оболочки для EOF. В первой программе при нажатии Enter, он заставляет курсор перемещаться в начало следующей строки (уведомление, как нет никакого "\n" в той программе, "\n" сделан пользователем, нажимающим Enter после входной строки). Это то, почему при использовании Ctrl+D, что разрыв строки не происходит, так как это не сама программа, производящая разрыв строки, но пользователя, нажимающего клавишу Enter, которая производит этот разрыв строки.

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

Для ясности помните, что вводит, буферизуется. Так, во второй программе Вы захватываете отдельный символ с начала входного буфера. Однако остальная часть тех символов останется там до использования использования другой вызов для получения их. Частая ошибка при начале программирования C/C++ забывает освобождать буфер, когда Вы сделаны с ним. Иначе те данные останутся там.

Я помню, когда я сначала начал программировать C++ (мой первый язык), я был соединен, что я буду использовать код несколько как следующее:

#include <iostream>

int main()
{
  std::cout << "Enter a sentence: ";
  std::string the_sentence;
  std::cin >> the_sentence;
  std::cout << "\nYou entered: " << the_sentence << std::endl;
  std::cout << "Enter another sentence: ";
  std::cin >> the_sentence;
  std::cout << "\nYou entered: " << the_sentence << std::endl;
  return 0;
}

И я запустил бы пример программы несколько как:

Enter a sentence: Hi my name is Bob!
You entered: Hi
Enter a sentence: (the program would seemingly skip this input block)
You entered: my

Это вызвано тем, что станд.:: вызов cin только читал бы вплоть до первого пространства, оставляя остальную часть входа на буфере. Приезжайте следующий станд.:: вызов cin, это вытянуло первую вещь, которую оставили в буфере, заставляющем это полностью пропускать фактическую входную фазу, поскольку это уже имело материал для чтения все еще в буфере.

Для сбрасывания буфера в C Вы могли использовать что-то как

while((c = getchar()) != '\n' && c != EOF);

который является просто циклом с условием продолжения остроты, который по существу делает то же самое как цикл из первой программы, но это просто отбрасывает вход

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

1
ответ дан 6 October 2019 в 08:58

Другие вопросы по тегам:

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