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

使用C++统计文本文件元音与偶数ASCII值的代码问题排查

问题诊断
  • 元音统计逻辑错误:遍历存储文件内容的bytes数组时,错误引用了循环外的byte变量(该变量存储的是文件读取完毕后的最终值),没有判断当前遍历到的字符i,导致所有元音识别逻辑完全失效。
  • 元音匹配范围不全:仅初始化了小写元音的集合,未覆盖大写元音,测试用例中的大写O等元音无法被识别。
  • 偶数统计逻辑和预期不符:当前代码会统计所有字符的ASCII值为偶数的数量,包括字母、数字等全部字符,你测试输出的5对应内容123454Mohsin里的2、4、4、h、n这5个ASCII为偶数的字符,符合代码当前逻辑,不符合预期是因为没有限定只统计数字字符。
  • 性能冗余:使用std::find遍历set匹配元音,效率远低于set自带的成员查找方法。
修复方案
  1. 元音统计时改为判断当前遍历的字符i,同时将字符转小写后再匹配元音集合,兼容大小写元音。
  2. 偶数统计前先判断字符是否为数字,仅统计数字字符的ASCII偶数值,如果你本身需求就是统计所有字符的偶数ASCII,去掉数字判断即可。
  3. 替换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 15:36:02