Delphyki 2022-12-15 20:34 采纳率: 100%
浏览 79
已结题

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

img

img

img


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

  • 写回答

3条回答 默认 最新

  • 婉瑄|Vivian_ 2022-12-16 11:41
    关注

    注意看你的输出结果中,“...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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月24日
  • 已采纳回答 12月16日
  • 创建了问题 12月15日

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大