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

如何用C++实现相邻元音统计?作业代码问题求助

解决C++字符串中辅音段对应相邻元音数量统计问题

嘿,我看你在这个作业上碰钉子了——你的代码不仅写得过于繁琐,还有几个关键错误直接导致它没法正常运行。别慌,咱们先把问题拆解清楚,先指出你代码里的问题,再给你清晰的思路和可运行的示例代码。

你的代码里的核心问题

  • 赋值与比较混淆:你在判断字符时用了=(赋值运算符)而非==(比较运算符),比如YourWord[i] = a是把'a'赋值给字符串的字符,而不是判断这个字符是否等于'a'。这不仅会破坏你的输入字符串,还会让所有判断逻辑完全失效。
  • 冗余的字符定义:没必要单独定义每个元音和辅音字符,写一个简单的辅助函数来判断字符类型会简洁太多。
  • 非法的变长数组:int counter[YourWord.length()]; 不是标准C的写法(C不允许用变量作为静态数组的大小),应该用std::vector<int>来动态存储数据。
  • 逻辑偏离核心:你的循环逻辑没抓住任务本质——我们需要先把字符串拆分成连续的元音段和辅音段,再针对性统计每个辅音段的相邻元音数量。

正确的解题思路

结合你的示例,任务核心是:输入字符串,输出对应每个连续辅音段的相邻元音总数量(比如输入computers,拆分出的辅音段是c、mp、t、rs,对应统计相邻元音数量)。如果你的示例输出实际是辅音段的长度,调整逻辑即可,核心思路通用。

核心步骤:

  1. 写辅助函数判断元音:用isVowel(char c)快速判断一个字符是否为元音,避免重复写冗长的判断条件。
  2. 拆分字符串为连续段:遍历字符串,把它拆分成连续的元音段或辅音段,记录每个段的类型(元音/辅音)和长度。
  3. 统计每个辅音段的相邻元音数:
    • 开头的辅音段:只统计后面第一个元音段的长度(如果存在)
    • 中间的辅音段:统计前后两个元音段的长度之和
    • 结尾的辅音段:只统计前面最后一个元音段的长度(如果存在)
  4. 输出结果:把统计好的结果按顺序输出。

可运行的示例代码

#include <iostream>
#include <vector>
#include <string>

// 判断字符是否为元音(假设输入都是小写)
bool isVowel(char c) {
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

int main() {
    std::string inputWord;
    std::cout << "Type your word: ";
    std::cin >> inputWord;
    std::cout << "Your word is: " << inputWord << std::endl;

    // 如果输入为空,直接退出
    if (inputWord.empty()) {
        return 0;
    }

    // 拆分字符串为段:pair第一个元素标记是否为元音段,第二个是段的长度
    std::vector<std::pair<bool, int>> segments;
    bool currentIsVowel = isVowel(inputWord[0]);
    int currentLength = 1;

    for (size_t i = 1; i < inputWord.size(); ++i) {
        bool charIsVowel = isVowel(inputWord[i]);
        if (charIsVowel == currentIsVowel) {
            // 和当前段类型一致,长度+1
            currentLength++;
        } else {
            // 类型切换,保存当前段,开始新段
            segments.emplace_back(currentIsVowel, currentLength);
            currentIsVowel = charIsVowel;
            currentLength = 1;
        }
    }
    // 保存最后一个段
    segments.emplace_back(currentIsVowel, currentLength);

    // 统计每个辅音段对应的相邻元音数量
    std::vector<int> result;
    for (size_t i = 0; i < segments.size(); ++i) {
        if (!segments[i].first) { // 当前是辅音段
            int vowelCount = 0;
            // 检查前面是否有元音段
            if (i > 0 && segments[i-1].first) {
                vowelCount += segments[i-1].second;
            }
            // 检查后面是否有元音段
            if (i < segments.size() - 1 && segments[i+1].first) {
                vowelCount += segments[i+1].second;
            }
            result.push_back(vowelCount);
        }
    }

    // 输出结果
    std::cout << "Result: ";
    for (size_t i = 0; i < result.size(); ++i) {
        if (i != 0) {
            std::cout << " ";
        }
        std::cout << result[i];
    }
    std::cout << std::endl;

    return 0;
}

如果你的实际需求是输出辅音段的长度(比如computers输出1 2 1 2正好对应各辅音段的字符数),那只需要修改统计逻辑:遍历所有辅音段,直接把段的长度加入结果列表即可,代码会更简单。

最后提醒一下:写代码时尽量用简洁的逻辑复用代码(比如辅助函数),遵循C++的标准语法,避免手动定义大量单个字符这种低效的写法。

内容的提问来源于stack exchange,提问作者Bálint Forgács

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:36:08