You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套for循环统计字符出现次数如何按输入顺序输出结果

问题原因

你当前的输出顺序异常是因为代码逻辑是按ASCII码顺序遍历大写字母A-Z、再遍历小写字母a-z输出统计结果,所以输出天然是按字母排序的,和原字符串的字符出现顺序无关。

修复方案

要保留大小写分开统计的逻辑,同时按原字符串的字符出现顺序输出,调整逻辑为:先遍历原字符串,按出现顺序记录首次出现的字符,同时统计每个字符的出现次数,最后按记录的出现顺序输出结果即可。

修改后可运行代码
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char str[100] = "";
    int count[256] = {0}; // 利用ASCII码索引统计,天然区分大小写
    char order[100] = {0}; // 记录字符出现顺序
    int order_len = 0;

    cout << "输入字符串值: ";
    cin >> str;
    int str_len = strlen(str);

    // 第一次遍历:统计次数 + 记录出现顺序
    for (int j = 0; j < str_len; j++) {
        char c = str[j];
        // 只统计大小写字母,和原逻辑保持一致
        if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
            count[(unsigned char)c]++;
            // 首次出现的字符才加入顺序列表
            if (count[(unsigned char)c] == 1) {
                order[order_len++] = c;
            }
        }
    }

    // 按出现顺序输出结果
    for (int i = 0; i < order_len; i++) {
        cout << order[i] << " - " << count[(unsigned char)order[i]] << endl;
    }

    return 0;
}

输入Prog测试时,输出效果和你期望的完全一致。

改动说明
  • 保留了大小写分开统计的逻辑:因为大小写字符的ASCII码本身不同,用ASCII码作为索引的count数组天然就会分开统计大小写,完全符合你的需求
  • 修复了原代码两个潜在问题:替换了不安全的gets()函数,将遍历全数组的sizeof(str)改为遍历实际输入长度的strlen(str),避免无效遍历
  • 新增顺序记录逻辑:仅将首次出现的字母加入顺序列表,最终按列表顺序输出,和原字符串的字符出现顺序完全一致

内容的提问来源于stack exchange,提问作者xdasryrytry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:09:01