Существует открытое и свободное John Превосходный человек взломщик пароля, который является отличным способом проверить базу данных текущего пароля.
В системах Linux и OS X вводимый символ, вызывающий EOF, - Ctrl - D . Для Windows это Ctrl - Z .
В зависимости от операционной системы этот символ будет работать только в том случае, если это первый символ в строке, то есть первый символ после Введите . Поскольку консольный ввод часто строчно-ориентирован, система может также не распознать символ EOF до тех пор, пока после него не будет введено Enter .
И да, если этот символ распознается как EOF , то ваша программа никогда не увидит настоящего персонажа. Вместо этого программа на C получит -1
из getchar ()
.
Вы должны изменить скобки на
while((c = getchar()) != EOF)
, потому что оператор «=» имеет более низкий приоритет, чем оператор «! =». Тогда вы получите ожидаемый результат. Ваше выражение равно
while (c = (getchar()!= EOF))
. На выходе вы получаете две единицы, потому что вы выполняете сравнение «c! = EOF». Это всегда будет одним символом, который вы ввели, а затем "\ n", который следует за нажатием клавиши возврата. За исключением последнего сравнения, где c действительно является EOF, оно даст вам 0.
РЕДАКТИРОВАТЬ EOF: EOF обычно равен -1, но это не гарантируется стандартом. Стандарт определяет только EOF в разделе 7.19.1:
EOF, который расширяется до целого числа. постоянное выражение с типом int и отрицательное значение, возвращаемое несколько функций для обозначения конец файла, то есть больше нет ввода из потока;
Разумно предположить, что EOF равно -1, но при использовании EOF вы не должны проверять конкретное значение, а лучше использовать макрос.
Значение EOF является отрицательным целым числом, чтобы отличать его от значений типа char, которые находятся в диапазоне от 0 до 255. Обычно это -1, но это может быть любое другое отрицательное число. .. в соответствии со спецификациями POSIX, поэтому не следует предполагать, что это -1.
Символ ^ D - это то, что вы вводите в консольном потоке в UNIX / Linux, чтобы сообщить ему о логическом завершении входного потока. Но в других контекстах (например, когда вы читаете из файла) это просто еще один символ данных. В любом случае символ ^ D (означающий конец ввода) никогда не попадает в код приложения.
Как говорит @Bastien, EOF также возвращается, если getchar ()
завершается неудачно. Строго говоря, вы должны вызвать ferror
или feof
, чтобы узнать, представляет ли EOF ошибку или конец потока.
EOF означает конец файла. Это знак того, что конец файла достигнут и данных больше не будет.
Редактировать:
Я исправился. В этом случае это не конец файла. Как уже упоминалось, он передается, когда передается CTRL + d (linux) или CTRL + z (windows).
Пара опечаток:
while((c = getchar())!= EOF)
вместо:
while((c = getchar() != EOF))
Также getchar () обрабатывает ключ возврата как допустимый ввод, поэтому вам также необходимо его буферизовать. EOF - это маркер для указать конец ввода. Обычно это целое число со всеми установленными битами.
#include <stdio.h>
int main()
{
int c;
while((c = getchar())!= EOF)
{
if( getchar() == EOF )
break;
printf(" %d\n", c);
}
printf("%d %u %x- at EOF\n", c , c, c);
}
выводит:
49 50 -1 4294967295 ffffffff- at EOF
для ввода:
1 2 <ctrl-d>
#include <stdio.h>
int main() {
int c;
while((c = getchar()) != EOF) { //precedence of != is greater than =, so use braces
printf("%d\n", c);
}
printf("%d - at EOF\n", c);
}
Я думаю, что это правильный способ проверить значение EOF. И я проверил вывод.
Для INPUT: abc и Enter я получил OUTPUT: 97 98 99 10. (значения ASCII)
Для INPUT Ctrl-D я получил OUTPUT: -1 - при EOF. Поэтому я думаю, что -1 - это значение для EOF.
Попробуйте использовать другой ввод вместо Ctrl-D, например Ctrl-Z. Я думаю, это зависит от компилятора к компилятору.