【发布时间】:2019-06-13 19:23:06
【问题描述】:
下面的程序旨在将字符串中的所有字符变为小写,删除所有元音,然后在每个字母之前打印一个句号。例如,输入“umbrella”将变为“.m.b.r.l.l”。但是当我输入“tour”时,'u'并没有被删除。
char ChangeToLow(char letter) {
if(letter <= 'Z' && letter >= 'A')
return letter - ('A' - 'a');
return letter;
}
int main()
{
string name;
cin>>name;
for (int i = 0 ; i < name.length() ; i++)
{
name[i] = ChangeToLow(name[i]);
if (name[i] == 'y' || name[i] == 'a'|| name[i] == 'u'|| name[i] == 'i'|| name[i] == 'e'|| name[i] == 'o')
{
name.erase(i,1);
}
}
for (int i = 0 ; i < name.length() ; i++)
{
cout<<'.'<<name[i];
}
}
我希望输出“.t.r”,但它会打印“.t.u.r”。 提前致谢。
【问题讨论】:
-
听起来你可能需要学习如何使用调试器来单步调试你的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programs 和 Debugging Guide
-
@jww:这是一种常见的 ASCII hack。
-
删除一个字母后,后面的所有字母都会在字符串中向左移动,但您仍在递增
i。例如。如果你删除 0,1 会变成 0,但你会继续移动到 1 并跳过“新”0。 -
@JonathanPotter 这似乎是最有可能的问题。 OP 应该能够通过测试任何两个或多个元音相邻的单词来确认这种行为。
-
@JonathanPotter 谢谢,成功了。