Почему это создает бесконечный цикл? - PullRequest
2 голосов
/ 16 октября 2011

Вот часть моей программы на C:

FILE *fin_length;
int c;
int countNewLines = 0;

fin_length = fopen( argv[1], "r" );

while( ( c == fgetc( fin_length ) ) != EOF ) {

    if( c == 10 ) countNewLines++;
}

fclose( fin_length );

Я запускаю программу с аргументами командной строки ./a.out myMessage.dat.myMessage.dat имеет длину 5 строк, где каждая строка содержит не более чем короткое предложение.Поэтому я ожидаю, что цикл найдет эти 5 строк с if( c == 10 ) и добавит одну к countNewLines каждый раз, когда найдет возврат каретки.

Почему я получаю здесь бесконечный цикл?

Ответы [ 3 ]

5 голосов
/ 16 октября 2011

while( ( c == fgetc( fin_length ) ) != EOF ) {

У вас слишком много знаков равенства. Это должно быть

while( ( c = fgetc( fin_length ) ) != EOF ) {

Когда вы используете ==, вы получаете два сравнения. Первый - это сравнение между c и возвращаемым значением fgetc().

Второе сравнение сравнивает этот результат (или true или false) с EOF. Я не посмотрел значение EOF, но это, безусловно, не 0 или 1 - это означает, что второе сравнение никогда не вернет false.

4 голосов
/ 16 октября 2011

Поскольку вы использовали == в свое время, вы хотите:

while ((c = fgetc(fin_length)) != EOF) {

Вы получали логическое значение из ==, а затем сравнивали его с EOF, и оно никогда не было равным, поэтому ваш цикл был бесконечным.

2 голосов
/ 16 октября 2011

Потому что == (равенство) - это не то же самое, что = (назначение).

Счастливого кодирования.

...