Использование isalpha и toupper вместе в цикле while дает "индекс вне границ"

Это код, который дает ошибку "index -65 out of bounds for type 'int [26]'"

char x;
int a[26] = {0};

printf("Enter first word: ");
while ((x=(isalpha(toupper(getchar())))) != '\n')
{
    a[x-'A']++;
}

тогда как, если я изменю это на это

char x;
int a[26] = {0};

printf("Enter first word: ");
while ((x=((toupper(getchar()))) != '\n')

    if (isalpha(x))
    {
        a[x-'A']++ ;
    }

Он ведет себя как хотел, ошибка ушла. Что я делаю не так в первом, что приводит к ошибке?

1 ответ

Решение

Сообщение об ошибке говорит index -65, так x-'A' в a[x-'A'] должно быть -65. Значение ASCII 'A' 65, давая x-65 = -65, который разрешается как x = 0,

Почему x = 0?

Так как x является результатом isalpha, который возвращает логическое значение. В частности, это возвращает 0 за ложь.

Кроме того, нет смысла сравнивать это логическое значение с '\n',

Ты имел ввиду

while (isalpha(x = toupper(getchar())))

?

Обратите внимание, что ваш код не обрабатывает EOF правильно, хотя. EOF это не charвот почему getchar возвращается int, Назначение его результата x теряет информацию.

Другие вопросы по тегам