Меня интересует C, поэтому я хочу больше узнать о C, особенно о C89, чтобы увидеть, как этот язык изменился с течением времени :). Я купил "Язык программирования C" (2-е издание) Дениса Ритчи.
Пример из книги приводит меня к сложной ситуации с функцией getchar().
Пример 1, который является моим примером после прочтения книги:
#include <stdio.h>
int main()
{
int c = getchar();
printf("\'\\n\' character in c: %d\n", c == '\n');
printf("\'\\n\' character in c: %d\n", c == '\n');
}
Результат примера 1:
a
'\n' character in c: 0
'\n' character in c: 0
В этом случае вывод не показывает никаких новых символов строк в этом вводе. ОДНАКО, еще один пример, который я пробую:
#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != EOF) {
printf("\'\\n\' character in c: %d\n", c == '\n');
}
}
и вывод кода:
a
'\n' character in c: 0
'\n' character in c: 1
Я не понимаю, почему второй пример дублирует функцию printf() и как она могла прочитать символ '\n' при входе в цикл. Между тем, первый пример не показывает ничего, относящегося к символу '\n'
В первом коде вы просто дважды проверяете этот a, а во втором коде проверяется a, а затем \n.
Мистер @Blaze, не могли бы вы объяснить мне, как работает память в обеих ситуациях? Спасибо
Ответ Лундина прекрасно это объясняет. Причина, по которой он не проверяет \n в первом примере, заключается в том, что вы не говорите ему об этом. int c = getchar(); переводит a в c, а затем вы проверяете это дважды. Вы никогда этого не читали \n. Вы, наверное, хотели еще один c = getchar(); после первого отпечатка.





Вы нажимаете ввод после ввода a.
Таким образом, ваш входной поток будет иметь «a\n».
while ((c = getchar()) != EOF) {
Будет читать, пока не достигнет EOF, поэтому сначала будет читать a, а затем \n(введите).
a и нажимаете ввод. Буфер стандартного ввода будет выглядеть как a, \n, два символа.c имеет значение 'a', которое не равно '\n', выход 0.c имеет значение '\n', равное '\n', выход 1.c становится EOF, printf никогда не выполняется.Спасибо. Но почему в первом примере не проверяется символ '\n'?
Это не потому, что вы запрашиваете символ только один раз. getchar() возвращает по одному символу за раз, а все оставшиеся символы остаются во входной строке для использования последующими вызовами getchar.
Возьмем ваш второй пример, т.е.
while ((c = getchar()) != EOF) {
printf("\'\\n\' character in c: %d\n", c == '\n');
}
и развернуть петлю. Это станет:
c = getchar();
if (c == EOF) return 0;
printf("\'\\n\' character in c: %d\n", c == '\n');
c = getchar();
if (c == EOF) return 0;
printf("\'\\n\' character in c: %d\n", c == '\n');
c = getchar();
if (c == EOF) return 0;
printf("\'\\n\' character in c: %d\n", c == '\n');
... and so on ...
Теперь сравните это с вашей первой версией, и вы увидите, что разница в том, что второй пример делает вызов getchar между printf, в то время как в первом примере есть только один вызов getchar.
Другими словами, в первом примере читается только символ 'a', а во втором примере сначала читается 'a', затем читается '\n', а затем читается .... (независимо от того, что вы наберете дальше)
Это связано с входным потоком; /n все еще остается во входном потоке после первого вызова.