无需样本数组如何统计字符串数组中各元素的出现次数(入门编程场景)
无需预定义样本数组的字符串出现次数统计方案(C++入门版)
核心实现思路
因为还没学习map、vector等容器,我们可以用基础数组配合临时计数变量实现需求,无需提前准备样本数组:
- 额外定义两个长度为MAX的数组:一个存已经识别到的不重复字符串,一个存对应字符串的出现次数
- 新增一个变量记录当前已经统计到的不重复字符串总数
- 遍历所有待统计的字符串时,先在已有的不重复字符串数组中查找:
- 找到匹配项就给对应计数+1
- 没找到匹配项就把该字符串新增到不重复数组末尾,对应计数初始化为1
原有代码问题修正
你现有代码存在数组越界风险:for(int i=0; i<=MAX; i++) 会访问到counter[20],而数组下标范围是0~19,会触发未定义行为。
完整实现代码
#include <iostream> #include <string> using namespace std; #define MAX 20 int main(){ // 待统计的原始字符串数组,后续可替换为从txt文件读取的车辆信息 string arr[MAX]={"ABC","AOE","ADC","ABC","ADC","ADC"}; int arr_len = 6; // 实际存储的有效数据条数,读文件时可以同步统计 string unique_str[MAX]; // 存不重复的字符串 int counter[MAX] = {0}; // 对应不重复字符串的计数 int unique_cnt = 0; // 当前已统计到的不重复字符串数量 // 遍历所有待统计字符串 for(int i=0; i<arr_len; i++){ int found = -1; // 去已有的不重复数组中查找是否存在匹配 for(int j=0; j<unique_cnt; j++){ if(unique_str[j] == arr[i]){ found = j; break; } } if(found != -1){ // 找到匹配,计数+1 counter[found]++; }else{ // 没找到匹配,新增到不重复数组 unique_str[unique_cnt] = arr[i]; counter[unique_cnt] = 1; unique_cnt++; } } // 输出统计结果 for(int i=0; i<unique_cnt; i++){ cout << unique_str[i] << " = " << counter[i] << endl; } // 若要适配读取txt文件的需求,只需要替换arr数组填充逻辑即可,示例: /* int arr_len = 0; // 循环读取文件内容,直到读满MAX条或者文件结束 while(arr_len < MAX && getline(cin, arr[arr_len])){ // 过滤空行(可选) if(arr[arr_len].size() > 0) arr_len++; } */ return 0; }
代码说明
- 所有逻辑仅用到基础数组、循环、判断,符合入门课程的知识点要求
- 可以适配任意内容的字符串数组统计,不需要提前知道样本内容
- 预留了读取txt文件的修改入口,替换原始数组填充逻辑即可实现车辆信息统计需求
内容的提问来源于stack exchange,提问作者Omar Munguía
相关产品推荐
相关产品推荐

