char C 申请了4个100个字节的空间,然后没有初始化它们,所以它们的值是不确定的,也就是说超出输入的字符串长度的那部分C[i][j]的值是不确定的,
而你直接这样a[(int)C[i][j]-'A']++; 是很危险的。
首先,字符串最后一个字符紧跟着的是个'\0',它的ascii码是0, (int)C[i][j] - 'A'是 -65,所以a[(int)C[i][j]-'A']++是修改了C[i][0]这个指针前65个字节的内容了,
而因为超出输入字符串长度部分的内容是不确定的,所以其他的修改了哪里的内容就确定了(相当危险),其中有一个是'X'字符则刚好给'X'加1了。
因为下面的代码构建a数组的时候j循环的次数是固定的100次,但是当每一行输入的字母数量不等于100的时候就会存在漏解或多解的情况:因为当字符串长度大于100时,第101个字符之后的字符你是没有被加入a数组中的;当字符串长度小于100时,在字符串中最后一个字符之后的字符直到第100个字符都是不能确定的,并且他们也不属于你输入的字符,所以j的循环只能循环字符串当前长度次。