использование isalpha и toupper вместе в цикле while дает «индекс вне границ» - PullRequest
0 голосов
/ 27 апреля 2018

Это код, который выдает ошибку "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 Ответ

0 голосов
/ 11 июня 2018

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

Почему x = 0?

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

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

Вы имели в виду

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

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

...