嵌套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
相关产品推荐
相关产品推荐

