Неправильный вывод программы на C без ошибок - PullRequest
1 голос
/ 01 сентября 2011

Привет, ребята, я просто написал эту небольшую программу на C, используя Notepad ++ и Cygwin. Итак, код следующий:

#include <stdio.h>

int main()
{
        int c, i, countLetters, countWords;
        int arr[30];

        countLetters = countWords = 0;
        for(i = 0; i < 30; ++i)
            arr[i] = 0;

        while(c = getchar() != EOF)
                if(c >= '0' && c <= '9')
                    ++arr[c - '0'];

                else if (c == ' ' || c == '\n' || c == '\t')
                    ++countWords;

                else
                    ++countLetters;

        printf("countWords = %d, countLetters = %d\n",
        countWords, countLetters );
}

но вместо подсчета слов программа считает слова как буквы и печатает их как буквы и слова = 0 ... где я ошибаюсь, потому что даже мой учитель не может дать мне ответ ...

Ответы [ 3 ]

8 голосов
/ 01 сентября 2011

Попробуйте использовать фигурные скобки, а c = getchar() нужны скобки.

while((c = getchar()) != EOF) {
      ^             ^
     /* Stuff. */
}
6 голосов
/ 01 сентября 2011

Ошибка здесь:

while(c = getchar() != EOF)

Необходимо заключить назначение в скобки, например, так:

while( (c = getchar()) != EOF)    /*** assign char to c and test if it's EOF **/

В противном случае оно интерпретируется как:

while(c = (getchar() != EOF))    /** WRONG! ***/

то есть c равен 1 для каждого прочитанного символа до конца файла.

2 голосов
/ 01 сентября 2011

Решение:

изменить время (c = getchar ()! = EOF) на время ((c = getchar ())! = EOF)

Причина:

! = Имеет более высокий приоритет чем =

Следовательно,

getchar ()! = EOF

оценивается как ложное и, таким образом, становится

while (c = 1) ==> while (0).

Следовательно, цикл повторяется с c = 1, каким бы ни был ваш ввод. (кроме EOF).

В этом случае Ваше выражение всегда оценивается как ложное.

так

if (c> = '0' && c <= '9') если if (1> = 48 && 1 <= 57) и всегда ложно. </p>

Кроме того,

иначе, если (c == '' || c == '\ n' || c == '\ t')

будет оценено как ложное.

Следовательно, счетная часть elseLetters ++ будет выполнена для всех входных данных!

В результате, как вы предписали.

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