c++求字符串中每个字母的个数

img

img

img


图三中第六题为要求,请问为什么我写的最后结果会多一个x和g呢

注意看你的输出结果中,“...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循环中多遍历出了几个字母,于是,我做了这样一个实验:

img


添加了cout<<list[j]后,就可以查看这个循环里到底发生了什么事,实验结果如下:

img


于是看出,首先遍历出了输入的good四个字母后,下面又多了一串,虽然大部分是空格,但还有个G,这就是多出来的字母之一。

分析: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;
}

运行结果:

img

兄弟,上面那个回答虽然也是问题,但是和你这个现象没有任何关系,所以他基本是答非所问,你每次运行产生的结果应该都是不一样的,这是因为你的list数组没有清0,而你在给count赋值的循环里循环了99次,good后面的字符完全是随机的,所以你只要把char list[num1];改成 char list[num1] = {0};就行!!满意请采纳