EndOfFile в C - EOF - PullRequest
       8

EndOfFile в C - EOF

0 голосов
/ 17 сентября 2009

Что вы положили в конец программы, -1, не работает:

#include <stdio.h>
//copy input to output
main() {
    char c;
    c = getchar();
    while(c != EOF) {
        putchar(c);
        c = getchar();
    }
}

Ответы [ 9 ]

10 голосов
/ 17 сентября 2009

Макрос: int EOF

Этот макрос представляет собой целочисленное значение , которое возвращается рядом функций для указания состояния конца файла или какой-либо другой ситуации ошибки. В библиотеке GNU EOF равно -1 . В других библиотеках его значением может быть другое отрицательное число.

5 голосов
/ 17 сентября 2009

Документация для getchar заключается в том, что она возвращает следующий доступный символ, приводит к unsigned char, а затем возвращает в int возвращаемое значение.

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

Если вы положите возвращаемое значение getchar в char, то в зависимости от того, является ли char вашей реализации подписанным или неподписанным, вы можете получить ложное обнаружение EOF, или вы можете никогда не обнаружить EOF даже когда ты должен.

Сигнализация EOF для библиотеки C обычно происходит автоматически при перенаправлении ввода программы из файла или конвейерного процесса. Чтобы сделать это в интерактивном режиме, зависит от вашего терминала и оболочки, но обычно в Unix это достигается с помощью Ctrl-D и в окнах Ctrl-Z на отдельной строке.

3 голосов
/ 17 сентября 2009

вы должны использовать int, а не char

2 голосов
/ 17 сентября 2009

Я согласен со всеми остальными в этой теме, говоря, что используйте int c , а не char .
Чтобы завершить цикл (по крайней мере в * nix-подобных системах), вы должны нажать Ctrl-D , чтобы отправить EOF .

Кроме того, если вы хотите, чтобы ваши персонажи отображались эхом, немедленно переписайте ваш код следующим образом:

#include<stdio.h>

int
main(void)
{
    int c;
    c = getchar();
    while (c != EOF)
    {
         putchar(c);
         c = getchar();

         fflush(stdout); /* optional, instant feedback */
    }

     return 0;
}
0 голосов
/ 03 марта 2018

Это все еще работает с типом данных char . Но трюки проверяют условие в цикле со значением int .

Первый: давайте проверим это. если вы напишите следующий код, например

printf("%d",getchar());

И затем, если вы дадите ввод с клавиатуры A Вы должны увидеть 65 , что составляет ASCII значение A или если вы дадите CTRL - D , тогда см. -1 .

Так что если вы реализуете эту логику, то код решения будет

#include<stdio.h>

int main()
{
    char c;
    while ((c = getchar()) != EOF){
        putchar(c);
        //printf("%c",c); // this is another way for output
    }
    return 0;
}
0 голосов
/ 01 марта 2017

Привет, я думаю, что это becoz в потоке -1 не один, а два символа, и ascii ни для одного из них не равен -1 или что-то еще используется для EOF

0 голосов
/ 17 сентября 2009

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

В Unix вы можете закрыть поток интерактивного ввода, набрав CTRL - D . Эта ситуация заставляет getchar() вернуть EOF. Но если файл содержит символ, код ASCII которого равен 4 (т.е. CTRL - D ), getchar() вернет 4, а не EOF.

0 голосов
/ 17 сентября 2009

Если для вашего компилятора по умолчанию установлено значение unsigned (или какими-либо опциями, используемыми для вызова компилятора), вполне вероятно, что

(c == EOF)

никогда не может быть правдой. Если sizeof(unsigned char) < sizeof( int), что в значительной степени всегда верно, то повышение char до int никогда не приведет к отрицательному значению, а EOF должно быть отрицательным значением.

Это одна из причин, по которой все (или, по крайней мере, многие, если не все) функции в стандарте C, которые работают с символами или возвращают их, указывают int в качестве параметра или типа возврата.

0 голосов
/ 17 сентября 2009

Если целочисленное значение, возвращаемое getchar (), сохраняется в переменной типа char и затем сравнивается с целочисленной константой EOF, сравнение никогда не может быть успешным, поскольку расширение знака переменной типа char при расширении до целого числа равно реализации. - стандарт POSIX с открытой группой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...