Это мой исходный код C.
Когда я его создаю в Ubuntu, он начинает получать символы, но я не знаю, как закончить программу, так как она не заканчивается вводом ENTER или возврат каретки.
Что означает EOF? Как я могу его вызвать?
Этот источник также находится в книге Денниса Ричи:
#include <stdio.h>
/* count digits, white space, others */
main ()
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar ()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c - '0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf ("digits =");
for (i = 0; i < 10; ++i)
printf (" %d", ndigit[i]);
printf (", white space = %d, other = %d\n", nwhite, nother);
}
ТЛ;др: ВФ-это не персонаж, это макрос, используемый для оценки негативных возврата функции ввода-значение. Можно использовать сочетание клавиш Ctrl+D, чтобы отправить [ф14] характер, который будет заставлять возвращать функция [ф15]
TL;д-р
обратимся к "с Справочное руководство", на Харбисона и Стила, 4-е изд. с 1995, стр. 317:
отрицательное целое число eof имеет значение, это не кодирование "реальный персонаж" . . . Например fget (раздел 15.6) возвращает eof, когда в конец файла, потому что нет "реального персонажа" для чтения.по существу [ф16] не символ, а целое значение, реализованный в [f17 в] представлять [ф18]. Таким образом, ответить на кос является правильным насколько это идет, но это не о получении "пустых" вход. Важно отметить, что здесь ВФ служит возвращаемое значение (по [зг19]) сравнения , не означает фактического характера. В [ф20] поддерживает эту:
отрицательное целое число eof имеет значение, это не кодирование "реальный персонаж" . . . Например fget (раздел 15.6) возвращает eof, когда в конец файла, потому что нет "реального персонажа" для чтения.
то fgetc(), еокп() и getchar() возвращает символ читается как беззнаковый Тип char приводится к int или eof на конец файла или ошибка. получает() и помощью fgets() обратный С В случае успеха и NULL в случае ошибки или конца файла, когда происходит при отсутствии символы были прочитаны. функции ungetc() возвращает c на успех, или eof в случае ошибки.ВОЗВРАЩАЕМОЕ значение
[Ф1]рассмотреть [клавиши f21] петля - его основной целью является повторение действий возвращаемое значение. Посмотри еще раз:
он как бы говорит продолжать делать вещи, если [ф22] возвращает успешный код ([ф23] или выше ; это обычное дело кстати, попробуйте запустить успешную команду, то [ф24] и не [f25 привод датчика] и вижу цифры, они возвращаются ). Так что если мы удачно сделать персонажа и ассинг с , возвращается код состояния 0, не равен -1. [ф26] определяется как -1. Поэтому, когда состояние [ф28] возникает, петель останавливается. И когда это произойдет ? Когда нет больше характера к вам, когда c = getchar() терпит неудачу. Вы могли бы написать [f30 С] и она все равно будет работать
[Ф2]кроме того, давайте вернемся к фактический код, вот выдержка из [ф31]
целое число
хотя символ eof-это не реальный персонаж, однако, существует [f32 из] (конец передачи) персонажа, который имеет десятичный код ASCII значение 04; она связана с клавиши Ctrl ярлык+д ( представлены также и Мета-характер ^D). В конце герой передачи, используемый для обозначения закрытия потока данных назад, когда компьютеры были использованы для контроля телефонных соединений и , следовательно, "конец передачи" именования.
[Ф3]так можно отправить, что ASCII-код в программу, как так, обратите внимание на $'\04', которая СРВ:
таким образом , мы можем сказать, что оно существует, но это не для печати
Примечание
мы часто забываем, что в прошлом компьютеры были не столь универсальны - дизайнеров, чтобы использовать каждую клавишу клавиатуры. Так , отправив [ф35] персонаж с CtrlD еще "передача персонажа" , не вписав в отличие от столицы, помощи shifta, чтобы дать компьютеру вход с имеющимися ключами. Таким образом, СРВ-настоящий характер в том смысле, что оно придет от пользователей, он доступен для чтения на компьютере (хотя и не для печати, не видимые человеком), она существует в памяти компьютера
то fgetc(), еокп() и getchar() возвращает символ читается как беззнаковый Тип char приводится к int или eof на конец файла или ошибка.
Примечание
если вы пытаетесь читать из /dev/NULL, что необходимо также вернуть ВФ, верно? Или что я получу там?
[Ф4]да, совершенно верно, потому что в [f36 в] Нет фактический характер для чтения , поэтому [фунции f37] возвращает код -1, и программа завершит свою работу сразу. Снова команда не возвращают eof. ВФ-это просто постоянная переменная, равная -1 , которые мы используем для сравнения код возврата функции getchar. [ф39] не существует, как персонажа, это просто статическое значение внутри [ф40].
демо:
[ф5]еще один гвоздь в гроб
[dрайвер d41]иногда он пытался доказать, что ВФ-это персонаж с такой код:[!dрайвер d41] [ф6]проблема в том, что Тип char может быть знаковым или беззнаковым значением. Кроме того, они являются наименьшая адресуемая тип данных, что делает их очень полезными в микроконтроллерах, где память ограничена. Поэтому вместо объявления [ф41] это часто можно увидеть в микроконтроллерах с малым память char foo = 25; или что-то подобное. Кроме того , символы могут быть знаковыми или беззнаковыми.
можно убедиться, что размер в байтах с программой такой:
[ф7]какой смысл ? Дело в том, что ВФ определяется как -1, но тип данных char может печатать целые значения.
skolodya@убунту:$ ВФ ССЗ.с-о ВФ ВФ.C: в функции "main": ВФ.с:4:5: предупреждение: Формат ‘%S’ не ожидает аргумент типа ‘char * ’ и, возвращает eof [-Wformat=] функции printf("%ы", ВФ);ОК . . .так что если мы попытаемся напечатать char как строку ?
явная ошибка, но тем не менее,ошибкой будет рассказать что-нибудь интересное:[!команда d48] [ф8]
не возвращают eof. ВФ-это как раз постоянная переменная, равная -1 , которые мы используем для сравнения код возврата функции getchar
[F9] ипечать ВФ в виде шестнадцатеричного значения дает FFFFFFFF, а 16 бит (8 байт) значение, два комплиментом [пулемет f44].
[ф10]выход:
[ф11] [размером d57]еще одна любопытная вещь происходит с помощью следующего кода:[!размером d57]если нажать д + д , мы получаем шестнадцатеричное значение 41 , очевидно же, что в таблице ASCII. Но для Ctrl + D , мы имеем [f45 с] , опять - возвращаемое значение getchar(), хранящиеся в c.
[ф12] [d63, как][и D40]еще один гвоздь в гроб[!и D40][!d63, как] [от f13]EOF означает конец файла. Хотя я не знаю, как вызвать следующий символ, вы можете запустить следующую программу, выполнив передачу файла, который посылает сигнал EOF в конце:
echo "Some sample text" | ./a.out
, где a.out - ваш скомпилированный источник