Использование 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
теряет информацию.