如何用C++实现相邻元音统计?作业代码问题求助
解决C++字符串中辅音段对应相邻元音数量统计问题
嘿,我看你在这个作业上碰钉子了——你的代码不仅写得过于繁琐,还有几个关键错误直接导致它没法正常运行。别慌,咱们先把问题拆解清楚,先指出你代码里的问题,再给你清晰的思路和可运行的示例代码。
你的代码里的核心问题
- 赋值与比较混淆:你在判断字符时用了
=(赋值运算符)而非==(比较运算符),比如YourWord[i] = a是把'a'赋值给字符串的字符,而不是判断这个字符是否等于'a'。这不仅会破坏你的输入字符串,还会让所有判断逻辑完全失效。 - 冗余的字符定义:没必要单独定义每个元音和辅音字符,写一个简单的辅助函数来判断字符类型会简洁太多。
- 非法的变长数组:
int counter[YourWord.length()];不是标准C的写法(C不允许用变量作为静态数组的大小),应该用std::vector<int>来动态存储数据。 - 逻辑偏离核心:你的循环逻辑没抓住任务本质——我们需要先把字符串拆分成连续的元音段和辅音段,再针对性统计每个辅音段的相邻元音数量。
正确的解题思路
结合你的示例,任务核心是:输入字符串,输出对应每个连续辅音段的相邻元音总数量(比如输入computers,拆分出的辅音段是c、mp、t、rs,对应统计相邻元音数量)。如果你的示例输出实际是辅音段的长度,调整逻辑即可,核心思路通用。
核心步骤:
- 写辅助函数判断元音:用
isVowel(char c)快速判断一个字符是否为元音,避免重复写冗长的判断条件。 - 拆分字符串为连续段:遍历字符串,把它拆分成连续的元音段或辅音段,记录每个段的类型(元音/辅音)和长度。
- 统计每个辅音段的相邻元音数:
- 开头的辅音段:只统计后面第一个元音段的长度(如果存在)
- 中间的辅音段:统计前后两个元音段的长度之和
- 结尾的辅音段:只统计前面最后一个元音段的长度(如果存在)
- 输出结果:把统计好的结果按顺序输出。
可运行的示例代码
#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
相关产品推荐
相关产品推荐

