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

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;
}

代码说明

  1. 输入验证:每个输入环节都做了合法性检查,比如数组大小必须是正整数,填充方式只能是A/M,手动输入的字符必须是字母,避免程序因为非法输入崩溃
  2. 自动填充:用随机数生成大写字母,你也可以修改成包含小写字母,只需要调整autoFill函数里的随机逻辑
  3. 统计逻辑:用std::map会自动按字符顺序排序输出,如果你不需要排序,换成std::unordered_map会更高效
  4. 内存管理:用动态数组分配内存,最后记得释放,避免内存泄漏

你可以直接编译运行这段代码,测试各种情况,比如输入非法大小、非法字符、选择自动/手动填充,都能得到符合预期的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:11:01