2016-10-15 2 views
1

Рассмотрим следующий код:GetChar() в течение условия цикла

int main() 
{ 
char c; 
for(;(c=getchar())+1;) 
    printf("%c\n",c); 
} 

Он получает символы, что я войти в терминал и печатает их. Когда я удаляю +1 в состоянии, программа работает, но она не останавливается, когда сигнал EOF (Ctrl + D). Когда я меняю его на +2 той же проблемой.

Мой вопрос как это +1 работы? Связано ли это с getchar() или for?

+5

Поскольку 'EOF' обычно определяется как' -1' и '-1 + 1 = 0'. Короче говоря, не делайте этого. То, что вы должны сделать, это 'while ((c = getchar())! = EOF)' – user3386109

+4

И, 'char c;' -> 'int c;' потому что 'getchar()' возвращает 'int'. –

+1

Чтобы подчеркнуть, на что @ user3386109 и @WeatherVane писал: вы должны использовать обе меры! EOF ** обычно ** - '-1', это не гарантируется! Общий совет: прочитайте документацию о функциях и макросах и т. Д., Которые вы используете! Все это можно найти в любой книге C. Наряду с тем, что добавляет средство в C (математические основы должны быть жесткими в школе). – Olaf

ответ

1

Это происходит потому, что INT значение EOF является -1, так что вы делаете не цикл, пока выражение (c=getchar())+1) получает значение 0, которое, когда вы читаете EOF (где значение exrpession составляет: -1 + 1 = 0). Кроме того, как WLL отметил в комментарии, вы должны объявить с как INT, так как getchar() returns int.

1

для заявления работает с лимитами известных уже , если вы хотите использовать условную петлю в то время как:

int main() 
{ 
int c; 
while ((c=getchar()) != eof()) 
    printf("%c\n",c); 
} 
+0

Возвращаемый тип 'getchar()' is 'int', а не' char'. Не используйте 'char'. –

+0

Я скопировал его код и отредактировал его !! спасибо –

1

Причина, почему это работает + 1 только.

Прототип: int getchar (void);

Возвращаемое значение

  • В случае успеха, прочитанный символ возвращается (продвинут на целочисленное значение).

  • Тип возврата является int для размещения для специального значения EOF, что указывает на отказ (-1).

  • Если стандартный ввод был в конце файла, функция возвращает EOF и устанавливает индикатор eof (feof) для stdin.

  • Если возникает некоторая другая ошибка чтения, функция также возвращает EOF, но вместо этого устанавливает свой индикатор ошибки (ferror).