C语言输入abcd却输出accd

img


    int a1[26]={0};
    char c[] = {'\0'};
    int i,k,j=0;
    gets(c);
    int len = strlen(c);
    for(i=0;i"%c",c[i]);
        if(c[i]<='z'&&c[i]>='a'){
            k = c[i]-'a';
            printf("%c\n",c[i]);
            a1[k] = a1[k] + 1;
        }
    }    

不明白为何输入abcd,输出accd,但若将a1[k] = a1[k] + 1;注释,则正常输出abcd,请问这是什么原理

我这是正常的呀

img

该回答引用GPTᴼᴾᴱᴺᴬᴵ
问题出在定义字符数组 c 上。在 C 语言中,字符数组的定义方式如下:

char c[] = {'a', 'b', 'c', '\0'};


这里用花括号括起来的是一个字符数组的初始化列表,其中每个元素都是一个字符。

在你的代码中,定义字符数组时使用了单引号,这样只会初始化一个字符而不是字符数组。因此,当你输入 "abcd" 时,实际上只有 "a" 被存储到了字符数组 c 中,而后续的字符 "b"、"c" 和 "d" 都没有被存储。

由于 len 的值仍然为 1,因此 for 循环只会执行一次,只有字符 "a" 被处理。这就是为什么你观察到的输出是 "accd",因为字符数组 c 中只有一个字符 "a" 被处理了,后续的字符 "b"、"c" 和 "d" 都没有被处理。

要解决这个问题,你可以使用以下方式定义字符数组 c,并且要确保数组大小足够存储输入的字符串:

char c[100];


另外,gets 函数在最新的 C11 标准中已被标记为废弃,因为它无法保证输入数据不会超出数组边界。你可以考虑使用 fgets 函数代替 gets,并且需要指定读取数据的最大长度。例如:

char c[100];
fgets(c, sizeof(c), stdin);



这样就能够正确读取并处理输入的字符串了。