2017-02-20 20 views
-1

Я читал Kernighan Ритчи и есть этот персонаж программа подсчета, поэтому я попытался реализацииЧто случилось с моей программой C и программой подсчета строк?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
char c; 
int i; 
c = getchar(); 
while (c != EOF) 
    i= i + 1; 
printf("%d",i); 
}` 

Когда я скомпилировать и запустить этот код, после того, как я ввожу некоторые символы нет никакого вывода после этого. Не печатается число, и я не могу понять, почему. Код выглядит отлично. Я также попытался использовать scanf(), но произошло то же самое.

Следующий пример был для подсчета строк на входе, и та же проблема была там.

+4

Помните, что C++ не C. –

+1

, если c! = EOF "while" цикл будет бесконечным –

+3

'int i = 0, c; while ((c = getchar())! = EOF) i = i + 1; ' – BLUEPIXY

ответ

7

В вашем коде, когда вы удар

i= i + 1; 

начальное значение i неопределенно. Таким образом, вся программа вызывает undefined behavior. Вам необходимо инициализировать i.

Чтобы уточнить, i является автоматической локальной переменной, если явно не указано, содержимое неопределенно. Использование неопределенного значения в этом случае приведет к UB.

Это означает, что char не может хранить значение EOF, сменив его на int.


После этого вы ошибаетесь в логике. getchar() не является петлей на своем собственном, вам нужно продолжать звонить getchar() внутри тела цикла while, чтобы обновить значение c, которое используется при проверке состояния в while.

+0

oops, yes Я назначил 0 на i, но это не решило проблему и не изменило тип переменной c на int. Я отредактировал вопрос. – user127

+0

... и ['getchar'] (http://www.cplusplus.com/reference/cstdio/getchar/) возвращает' int', а не 'char'. –

0

Вы пропустили при инициализации:

int i = 0;

2
int main() 

Хорошо. Не main() и не void main(). Держи это так.

{ 
char c; 

Плохо. getchar() возвращает int.

int i; 

Плохо. Не инициализировано, значение неопределенно. Вы собираетесь увеличивать -7445219, или, возможно, почтовый пирог, который знает.

c = getchar(); 

Хорошо, вы прочитали один символ.

while (c != EOF) 

Но вы не можете сравнить его с EOF, потому что EOF не вписывается в char.

i= i + 1; 

Похоже, вы забыли сделать что-то в теле цикла. Что-то, что собирается изменить c, возможно, чтобы ваша петля имела шанс закончить.

printf("%d",i); 

Рекомендуется добавить новую строку в последнюю строку вашего вывода.

} 

Это все люди.

1

Вам нужно всего лишь добавить inicialization для "я"

INT I = 0;