使用C++统计文本文件元音与偶数ASCII值的代码问题排查
问题诊断
- 元音统计逻辑错误:遍历存储文件内容的
bytes数组时,错误引用了循环外的byte变量(该变量存储的是文件读取完毕后的最终值),没有判断当前遍历到的字符i,导致所有元音识别逻辑完全失效。 - 元音匹配范围不全:仅初始化了小写元音的集合,未覆盖大写元音,测试用例中的大写
O等元音无法被识别。 - 偶数统计逻辑和预期不符:当前代码会统计所有字符的ASCII值为偶数的数量,包括字母、数字等全部字符,你测试输出的5对应内容
123454Mohsin里的2、4、4、h、n这5个ASCII为偶数的字符,符合代码当前逻辑,不符合预期是因为没有限定只统计数字字符。 - 性能冗余:使用
std::find遍历set匹配元音,效率远低于set自带的成员查找方法。
修复方案
- 元音统计时改为判断当前遍历的字符
i,同时将字符转小写后再匹配元音集合,兼容大小写元音。 - 偶数统计前先判断字符是否为数字,仅统计数字字符的ASCII偶数值,如果你本身需求就是统计所有字符的偶数ASCII,去掉数字判断即可。
- 替换
std::find为set的count成员方法,提升查找效率。
修复后完整代码
#include <fstream> #include <iostream> #include <set> #include <string> #include <vector> #include <cctype> // 用于tolower、isdigit函数 using namespace std; int main() { set<char> vowels = {'a', 'e', 'i', 'o', 'u'}; string filename("carry.txt"); vector<char> bytes; char byte = 0; int evenCount = 0; int vowelsCount = 0; ifstream input_file(filename.c_str()); if(!input_file.is_open()) { cerr << "Could not open the file - '" << filename << "'" << endl; return EXIT_FAILURE; } while(input_file.get(byte)) { bytes.push_back(byte); } for(const auto& i : bytes) { // 偶数ASCII统计:仅统计数字字符的偶数ASCII值,不需要限定的话去掉isdigit判断即可 if(isdigit(i) && i % 2 == 0) { evenCount++; } // 元音统计:转小写后匹配,兼容大小写 if(vowels.count(tolower(i))) { vowelsCount++; } } cout << "Number of vowels are:" << vowelsCount << endl; cout << "Number of Evens are:" << evenCount << endl; input_file.close(); return EXIT_SUCCESS; }
针对测试内容123454Mohsin,修复后输出元音数量为2(对应o、i),数字偶数数量为3(对应2、4、4),符合预期。
内容的提问来源于stack exchange,提问作者Mohsin Mehmood
相关产品推荐
相关产品推荐

