首页 > 解决方案 > 试图使函数用 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);
}

我尝试使用包含所有元音的数组并遍历它以检查字符串的字符是否等于它。

标签: c++string

解决方案


最大的问题是你在这里越界了 s[i] = vow[(j + 1)];。这会调用未定义的行为,并且代码的输出原则上可以是任何东西。

还有一些其他小问题。我想这只是由于测试了函数,但是分配给函数中的参数使得无法使用其他输入进行测试"computer"(最好在更改函数任何内容的情况下测试不同的输入)。您不需要通过非常量引用传递参数返回结果。两者都做可能会令人困惑,请选择其中之一。此外,由于有符号-无符号比较,您似乎修复了一个警告,但是您以错误的方式得到了修复,size_t用于索引。或者更确切地说,使用基于范围的循环。

如果您修复了越界问题,您仍然会遇到问题,即内部循环将替换ae,在下一次迭代中它将递增j,下一次迭代它将替换ei,依此类推。您需要在替换一次字符后跳出循环。

要解决越界问题,您可以使用%. 更通用的方法是使用 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");
}

推荐阅读