Я проверил множество ситуаций с getchar()
и putchar()
и '\n'
и EOF (в Visual Studio), чтобы лучше понять, как работает буферизация и getchar
.путают с буфером и EOF и getchar
Если мой код
int c;
printf("Enter character\n");
/* 1 - number for explaining steps */
c = getchar();
putchar(c);
/* 2 */
c = getchar();
putchar(c);
printf("hi");
В этом коде, если я вхожу символ a
и нажмите Enter, он будет показывать
a
hi
Это означает, что, когда я при нажатии ввести '\n'
будут сохранены в буфере тоже, а затем первый элемент в буфере (a
) переходит к первому c=getchar()
и печатается a
; то второй элемент в буфере (\n
) переходит ко второму c=getchar()
и печатает новую строку.
я делаю вывод, что '\n'
сохраняется в буфере, и это не является результат способности командования идти на новую строку при нажатии войти, потому что я тестировал другой код для этого:
while ((c = getchar()) != '\n')
putchar(c);
printf("hi");
В этом коде, когда Я напечатал a
и нажмите клавишу ВВОД печатает ahi
и новая линия не печатает это означает, что, когда a
передается getchar()
, putchar()
печатает тогда, когда getchar()
получает '\n'
, цикл завершается и putchar()
внутри цикла не печатает новую строку поэтому команда не является причиной для n ew.
Теперь я хочу, чтобы проверить другой код:
int c;
while ((c = getchar()) != EOF)
putchar(c);
printf("hi");
return 0;
В одном случае я прохожу его abc
и сигнал EOF (в моей системе^Z (Ctrl + Z)) он будет показывать abc->
, Если мы посмотрим на него, как и предыдущий код: abc-1(or every thing else shows eof)'\n'
должны были сохранены в буфере и первый a
перейти к первому GetChar (работам цикла первого раза!) b
пассов на второй GetChar затем c
переходит к третьим —, а затем -1
должен были отправлены в c=getchar()
, и это противоречит условию, и цикл должен завершиться.
Однако он печатает ->
и цикл продолжается, а новая строка (последний элемент в буфере) не печатает. Вместо этого, когда я просто ctr +z
, когда c=getchar()
считывает знак EOF из буфера, оканчивается контур и печатается новая строка, так почему он печатает новую строку? Он читает EOF, и в этой ситуации он не должен читать ничего в буфере .
Этот последний абзац - почти полностью одно предложение/вопрос; можете ли вы переформатировать его? –
В будущих вопросах и обходе кода в целом вы можете поместить такие вещи, как шаг № 1 в комментариях к коду. Программисты будут знать, чтобы посмотреть в комментариях, когда вы говорите о шаге 1, и это позволяет нашим внутренним компиляторам C отбрасывать свои приемы, когда мы читаем ваш код. – Philip
В последнем примере после обработки c следующий символ - '-' не '-1'. Вы уверены, что «>» не является вашим приглашением в терминале? – Philip