c++ - 试图使函数用 e 替换 a,用 i 替换 e,用 o 替换 i,用 o 替换 o,用字符串中的 a 替换 u
问题描述
string rotate_vowels(string& s) {
s = "computer";
char vow[] = { 'a', 'e', 'i', 'o', 'u' };
for (int i = 0; i < (int)s.length(); i++)
{
for (int j = 0; j <= 4;)
{
if (s[i] == vow[j])
{
s[i] = vow[(j + 1)];
}
else
{
j++;
}
}
}
return s;
}
int main()
{
string p;
cout << rotate_vowels(p);
}
我尝试使用包含所有元音的数组并遍历它以检查字符串的字符是否等于它。
解决方案
最大的问题是你在这里越界了 s[i] = vow[(j + 1)];
。这会调用未定义的行为,并且代码的输出原则上可以是任何东西。
还有一些其他小问题。我想这只是由于测试了函数,但是分配给函数中的参数使得无法使用其他输入进行测试"computer"
(最好在不更改函数任何内容的情况下测试不同的输入)。您不需要通过非常量引用传递参数并返回结果。两者都做可能会令人困惑,请选择其中之一。此外,由于有符号-无符号比较,您似乎修复了一个警告,但是您以错误的方式得到了修复,size_t
用于索引。或者更确切地说,使用基于范围的循环。
如果您修复了越界问题,您仍然会遇到问题,即内部循环将替换a
为e
,在下一次迭代中它将递增j
,下一次迭代它将替换e
为i
,依此类推。您需要在替换一次字符后跳出循环。
要解决越界问题,您可以使用%
. 更通用的方法是使用 a std::unordered_map
:
#include <string>
#include <iostream>
#include <unordered_map>
std::string rotate_vowels(std::string s) {
std::unordered_map<char,char> repl{{'a','e'},{'e','i'},{'i','o'},{'o','u'}};
for (auto& c : s){
auto it = repl.find(c);
if (it != repl.end()) c = it->second; // if the character was found replace it
}
return s;
}
int main() {
std::cout << rotate_vowels("computer");
}
推荐阅读
- node.js - 无法通过以下代码连接到 MongoDB 云。我需要知道这段代码有什么问题?
- java - 与自身的多对多关系并结合结果
- git - Jenkins Pipeline:如何避免对存储库进行轮询
- continuous-integration - 从 Nexus 获取工件到 Rundeck
- javascript - 如何通过在 JQuery 中切换来恢复 div 的默认大小?
- javascript - d3.js 地图中的坐标转换
- visual-studio-code - 如何使用 VS Code 将多行合并为一行?
- c# - 用于简单 c# 服务的 azure 服务 - 没有 web
- javascript - Firebase 规则 .validate 返回:权限被拒绝
- apache-spark-sql - 应用 unix_timestamp 时 Spark-scala 代码错误