【问题标题】:I'm getting a weird type of error while running我在运行时遇到了一种奇怪的错误
【发布时间】:2021-11-29 01:49:32
【问题描述】:

编写一个接收字符串的程序 小号 作为输入,将从字符串中删除元音 a、e、i、o、u(小写或大写)。如果两个或两个以上的元音同时出现,则程序将忽略所有这些元音。

#include <bits/stdc++.h>
#define rep(a, b, c) for (int a = b; a < c; a++)
#define vi vector<int>
using namespace std;
int main()
{
    bool yo;
    yo = false;
    int he;
    string s = "Heel";
    int i = 0;
    // cin >> s;
    while (i < s.length())
    {

        if (s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u' || s[i] == 'A' || s[i] == 'E' || s[i] == 'I' || s[i] == 'O' || s[i] == 'U')
        {

            if (s[i + 1] == 'a' || s[i + 1] == 'e' || s[i + 1] == 'i' || s[i + 1] == 'o' || s[i + 1] == 'u' || s[i + 1] == 'A' || s[i + 1] == 'E' || s[i + 1] == 'I' || s[i + 1] == 'O' || s[i + 1] == 'U')
            {
                while (s[he + 1] != 'a' || s[he + 1] != 'e' || s[he + 1] != 'i' || s[he + 1] != 'o' || s[he + 1] != 'u' || s[he + 1] != 'A' || s[he + 1] != 'E' || s[he + 1] != 'I' || s[he + 1] != 'O' || s[he + 1] != 'U' || he < s.length())
                {
                    he++;
                }
            }
            else
            {
                s.erase(remove(s.begin(), s.end(), s[i]), s.end());
            }
            i = i + he;
            he = 0;
        }
        else
        {
            i++;
        }
    }
    cout << s;
    return 0;
}

【问题讨论】:

  • 你的错误是什么?
  • s[he + 1] 访问未初始化的变量he,因此程序表现出未定义的行为。

标签: string loops c++11


【解决方案1】:

因为 s[he + 1] 到达了另一个尚未保留给 s 的内存扇区,因此您遇到了访问内存冲突。

您正在创建一种无限循环,该循环在出现任何元音时运行,并且最重要的验证是在条件结束时,它必须在存在时验证没有机会触及无效的内存扇区。

您的代码:

while (s[he + 1] != 'a' || s[he + 1] != 'e' || s[he + 1] != 'i' || s[he + 1] != 'o' || s[he + 1] != 'u' || s[he + 1] != 'A' || s[he + 1] != 'E' || s[he + 1] != 'I' || s[he + 1] != 'O' || s[he + 1] != 'U' || he < s.length())

我的建议:

he = 0;
bound = s.length() - 1;
while (he < bound && (s[he + 1] != 'a' || ... || s[he + 1] != 'U'))
{
  //..
  he++;
}

如果 he &lt; s.length() 将不会计算余数条件。

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 2020-03-26
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多