C++中统计字符数组重复元素出现次数的实现问题
实现符合需求的C++字符数组统计程序
我帮你写了一个完全贴合需求的C++程序,下面是完整实现和细节说明:
功能拆解与实现思路
- 数组大小输入:先让用户输入数组长度,会处理非数字的非法输入,确保程序不会崩溃
- 填充方式选择:用户可以选自动生成字母(输入
A)或者手动输入(输入M),同样会处理无效选择的情况 - 输入验证:不管是手动输入还是自动生成,只保留
a-z和A-Z的字符,手动输入时如果输入非法字符会立刻提示并要求重新输入 - 次数统计:用
std::map来统计每个字符的出现次数,最后按顺序输出结果
完整代码
#include <iostream> #include <map> #include <cstdlib> #include <ctime> #include <cctype> // 验证字符是否为字母 bool isValidChar(char c) { return isalpha(static_cast<unsigned char>(c)); } // 获取合法的数组大小 int getValidSize() { int size; while (true) { std::cout << "请输入字符数组的大小:"; if (std::cin >> size && size > 0) { break; } else { std::cout << "错误:请输入一个正整数!\n"; std::cin.clear(); std::cin.ignore(1000, '\n'); // 清空输入缓冲区 } } return size; } // 获取合法的填充方式选择 char getFillChoice() { char choice; while (true) { std::cout << "\n请选择填充方式:\n"; std::cout << "输入 A 自动填充数组值,输入 M 手动输入:"; std::cin >> choice; choice = toupper(static_cast<unsigned char>(choice)); if (choice == 'A' || choice == 'M') { break; } else { std::cout << "错误:请输入有效的选项(A/M)!\n"; std::cin.clear(); std::cin.ignore(1000, '\n'); } } return choice; } // 手动输入字符数组 void manualInput(char* arr, int size) { std::cout << "\n请输入" << size << "个字母(a-z/A-Z):\n"; for (int i = 0; i < size; ++i) { char c; while (true) { std::cin >> c; if (isValidChar(c)) { arr[i] = toupper(static_cast<unsigned char>(c)); // 统一转大写方便统计,也可以保留原大小写 break; } else { std::cout << "错误:请输入有效的字母!重新输入第" << i+1 << "个字符:"; std::cin.clear(); std::cin.ignore(1000, '\n'); } } } } // 自动填充字符数组 void autoFill(char* arr, int size) { srand(static_cast<unsigned int>(time(nullptr))); // 初始化随机种子 std::cout << "\n自动生成的字符数组为:"; for (int i = 0; i < size; ++i) { // 随机生成大写字母(A-Z),也可以改成包含小写 arr[i] = 'A' + rand() % 26; std::cout << arr[i] << " "; } std::cout << "\n"; } // 统计并显示字符出现次数 void countAndDisplay(char* arr, int size) { std::map<char, int> countMap; // 统计次数 for (int i = 0; i < size; ++i) { countMap[arr[i]]++; } // 输出结果 std::cout << "\n各字符的出现次数:\n"; for (const auto& pair : countMap) { std::cout << pair.first << ": " << pair.second << "次\n"; } } int main() { int arrSize = getValidSize(); char* charArray = new char[arrSize]; // 动态分配数组 char fillChoice = getFillChoice(); if (fillChoice == 'M') { manualInput(charArray, arrSize); } else { autoFill(charArray, arrSize); } countAndDisplay(charArray, arrSize); delete[] charArray; // 释放内存 return 0; }
代码说明
- 输入验证:每个输入环节都做了合法性检查,比如数组大小必须是正整数,填充方式只能是A/M,手动输入的字符必须是字母,避免程序因为非法输入崩溃
- 自动填充:用随机数生成大写字母,你也可以修改成包含小写字母,只需要调整
autoFill函数里的随机逻辑 - 统计逻辑:用
std::map会自动按字符顺序排序输出,如果你不需要排序,换成std::unordered_map会更高效 - 内存管理:用动态数组分配内存,最后记得释放,避免内存泄漏
你可以直接编译运行这段代码,测试各种情况,比如输入非法大小、非法字符、选择自动/手动填充,都能得到符合预期的结果。
内容的提问来源于stack exchange,提问作者NKNz
相关产品推荐
相关产品推荐

