【问题标题】:Getting an error while reversing vowels in a string [closed]反转字符串中的元音时出错[关闭]
【发布时间】:2019-08-13 10:27:52
【问题描述】:

我知道关于这个主题有类似的问题,但我想知道我的方法中的错误。

我正在编写一个代码来反转字符串中的元音。我首先将一个字符串的所有元音放入一个向量中,然后通过替换元音从后面循环字符串,但我一直收到错误。

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

using namespace std;

string reverseVowels(string s)
{
    vector<char>v;
    vector<char>v2;
    char c;
    for (int i = 0; i < s.size(); i++)
    {
                //taking all the vowels of the string into a vector
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')
        {
            v.push_back(s[i]);
        }
    }

        //reversing the vowels of the string
    for (int i = s.size() - 1; i >= 0; i--)
    {
        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')
        {
            s[i] = v[i];  //Getting an error here
        }
    }
    return s;
}

int main()
{
        //Required output is "holle"
    string s = "hello";
    string p = reverseVowels(s);
    cout << p << endl;
    return 0;
}

【问题讨论】:

  • 如果字符串的大小是100怎么办?什么是 v[100]?
  • v 不应在此代码中被 i 索引...永远
  • 如果你真的想这样做,那么例如引入从 v 向量中选择元音的新索引。这是因为在大多数情况下,v 的大小会小于 s 的大小。你尝试得到 v[s.size() - 1].
  • 不能解决您的问题,但您确实意识到您可以在不使用任何额外存储空间的情况下进行此逆转?根本不需要元音向量。
  • 这种方法相当粗暴。不需要那个元音向量。只需从字符串的前面扫描直到碰到元音,然后从字符串的后面扫描直到碰到元音,然后交换两者。从您停止的点继续扫描。重复直到两次扫描相遇。

标签: c++ arrays string vector data-structures


【解决方案1】:

您需要另一个用于反转元音的索引:

for (int vowelIdx = 0, i = s.size() - 1; i >= 0; i--)
{
    if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u')
    {
        s[i] = v[vowelIdx++];  //Getting an error here
    }
}

编辑

关于您在下面的评论;让我们检查一下单词hello 的代码。第一个循环遍历hello 中的所有元音并将向量v 填充为eo。它有两个元音,e 作为第一个元素,o 作为第二个/最后一个元素。

您的第二个循环反向遍历单词hello,并遇到第一个元音o。您需要将其重置为e,这是向量v 的第一个元素。这是您的代码出错的地方。 i 的值现在是 4,因此您尝试使用向量 v 的第 4 个索引,它只有两个元素。您必须设置s[4] = v[0]s[1] = v[1]。但是,您的代码尝试设置s[4] = v[4](看到错误?)和s[1] = v[1]

希望现在很清楚,如果不尝试在纸上使用更长的单词。我相信你会明白这一点的。

【讨论】:

  • 你能解释一下为什么我需要另一个索引吗?
  • @philip 查看编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 2021-01-21
相关资源
最近更新 更多