我在运行时遇到了一种奇怪的错误
Posted
技术标签:
【中文标题】我在运行时遇到了一种奇怪的错误【英文标题】: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
,因此程序表现出未定义的行为。
【参考方案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 < s.length()
将不会计算余数条件。
【讨论】:
以上是关于我在运行时遇到了一种奇怪的错误的主要内容,如果未能解决你的问题,请参考以下文章
子类化 UIAlertController 并遇到运行时错误