2009-09-17 2 views
0

Что вы положили в, чтобы закончить программу, -1, не работает:ENDOFFILE в С - EOF

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

Вы используете библиотеку GNU? – rahul

+0

Нет, платформа Win32 –

+1

Доза Ctrl-D не работает? –

ответ

2

Я согласен со всеми другими людьми в этой теме, говоря, использование Int C не полукокса.
Чтобы закончить цикл (по крайней мере, на * 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

Итак, вы не можете отправить последовательность символов для представления EOF? –

+0

@ Chris_45: нет, EOF в этом смысле «вне диапазона», т. Е. Не действительный символ. – unwind

+0

Как вы лучше всего описываете, что это такое, это «вне диапазона»?/С уважением –

3

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

10

Macro: Int EOF

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

+0

На платформе Win32 это также -1 (в stdio.h): #define EOF (-1) –

+0

@Manu: То, что было phoenix, сказал, что это макрос, который оценивает int. Тип литерала -1 - int. – unwind

+0

Преобразование int -1 в char, я думаю, это тоже -1. –

5

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

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

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

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

0

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

0

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

(c == EOF) 

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

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

0

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

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

-1

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

0

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

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

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

И затем, если вы дадите ввод с клавиатуры Вы должны увидеть , который ASCII значение или если вы даете 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; 
}