为什么这个pangram计划不起作用?

时间:2015-02-12 06:07:09

标签: c arrays

pangram程序几乎是正确的,但我不明白为什么它不起作用?

int main() {

    /* Enter your code here. Read input from STDIN. Print output to STDOUT */  
    char *a=malloc(256);
    int first[26]={0},c=0,i=0,flag=0;
    //printf("Enter string");
    fgets (a, MAX_NAME_SZ, stdin);
    while(a[c]!='\0')
    {
        first[a[c]-'a']++;
        c++;
    }

    for(i=0;i<26;i++)
    {   
        if(first[i]==0)
        {
            flag=1;
            break;
        }
    }

    if(flag==0)
    {
        printf("panagram");
    }
    else
    {
        printf("not panagram");
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的代码中存在逻辑错误,因为您没有对用户输入进行任何输入验证和/或完整性检查。

在您的代码中,

 first[a[c]-'a']++;
如果first不在a[c]范围内,

会尝试访问[a, z]数组中的无效内存位置。

即使用户输入UPPER个案字母或空格 [] (所有这些都在逻辑上应视为有效输入),通过访问越界内存来编写经验undefined behaviour

为避免这种情况,请在将a[c]值直接用作first数组的索引之前检查{{1}}值。