注意看你的输出结果中,“...with return value 678938”;而你的main函数最后是return 0的,这说明你的程序并没有正常退出。
问题在哪呢?问题出在你中间那个累加counts的for循环。你使用 list[j] - 'a' 的方式索引counts,很聪明,但你忽略了一点:不论当前这个字符是大写还是小写,都会在counts数组里索引两次(list[j] - 'a'和list[j] - 'A')。
我们知道,一个小写字母 - 'A',会 >= 32,这已经超出了counts数组的范围,所以程序崩溃了;而且,一个大写字母 - 'a',会 < 0,这也是完全不允许的。
所以更好的办法是先判断这个字母是大写还是小写,然后分别减不同的A(a)。
(补充:你还应该跳过空格和其他特殊字符,想一想为什么)
如果觉得有用,帮孩子点个采纳吧!QAQ~
附上我修改的代码:
#include <iostream>
constexpr uint32_t si = 99;
void count(const char s[], int counts[])
{
for(int i = 0; i < si; i++)
{
if(s[i] == ' ')
continue;
if(s[i] >= 'a' && s[i] <= 'z')
counts[s[i] - 'a']++;
else
counts[s[i] - 'A']++;
}
// prints the output
for(int i = 0; i < 26; i++)
{
if(counts[i] != 0)
std::cout << static_cast<char>(i + 'a')
<< ": " << counts[i] << " times \n";
}
}
int main()
{
char str[si]{};
int counts[26]{0};
std::cout << "Input a string: ";
std::cin.getline(str, si);
count(str, counts);
return 0;
}
刚开始,我也很难看出问题,由于多了几个字母,本人猜测是在中间那个for循环中多遍历出了几个字母,于是,我做了这样一个实验:
分析:list的长度你已经在上面定义了为num2=99,这导致你输入的虽然是4个字母,但遍历次数不是4,对于后面的list,系统应该是赋予了初始值,也参与了统计,有可能这个初始值的ASCALL对应的值恰好包含某个字母,导致结果出现错误。
解决办法:不再定义num2=99,因为我们也无法知道用户输入字符串长度,于是先定义字符串str,输入字符串后再确定长度n,修改代码为:
#include <iostream>
using namespace std;
const int num1 =26;
int main()
{
string str;//定义一个字符串
int counts[num1];
cout<<"请输入一个字符串:";
cin>>str;//输入字符串
int n=str.length();//获取字符串的长度
for(int i=0;i<num1;i++)
counts[i]=0;//先把所有个数都初始化为0
for(int j=0;j<n;j++)//遍历字符串(由于字符串长度为n,遍历n次)
{
counts[str[j]-'a']++; // 有一个加一次
counts[str[j]-'A']++; //A与a一样
}
for (int i=0;i<num1;i++)
{
if(counts[i]!=0)
cout<<static_cast<char>(i+'a')<<":"<<counts[i]<<" times "<<endl;
}
return 0;
}
运行结果:
兄弟,上面那个回答虽然也是问题,但是和你这个现象没有任何关系,所以他基本是答非所问,你每次运行产生的结果应该都是不一样的,这是因为你的list数组没有清0,而你在给count赋值的循环里循环了99次,good后面的字符完全是随机的,所以你只要把char list[num1];改成 char list[num1] = {0};就行!!满意请采纳