在while循环中使用isalpha和toupper一起使得" index out of bounds"

时间:2018-04-27 04:16:20

标签: c arrays while-loop indexoutofboundsexception

这是给出"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 :(得分:1)

错误消息显示为index -65,因此x-'A'中的a[x-'A']必须为-65。 'A'的ASCII值为65,提供x-65 = -65,其解析为x = 0

为什么x = 0

因为xisalpha的结果,它返回一个布尔值。特别是,它会为 false 返回0

此外,将此布尔值与'\n'进行比较是没有意义的。

你的意思是

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

请注意,您的代码无法正确处理EOFEOF不是char,这就是getchar返回int的原因。将结果分配给x会丢失信息。