元音的字符串操作未按预期工作

Posted

技术标签:

【中文标题】元音的字符串操作未按预期工作【英文标题】:String manipulation with vowels not working as intended 【发布时间】: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 谢谢,成功了。 【参考方案1】:

当您从字符串中删除一个字符时,剩余的内容会移动以填充空间。他们的指数会相应调整。在您的游览示例中,它看起来如下所示:

在您从游览中删除“o”后,您的循环计数器 i 增加到 2,而 name[i] 现在是“r”。避免这种行为的一种选择是在删除元音时减少 i

【讨论】:

【参考方案2】:

我有一些建议给你。首先,您不应该将using namespace std; 放入您的代码中。它只会增加混乱,被认为是一种不好的做法。我认为这也是一件好事,如果你考虑学习 STL,如果你的目标真的是深入学习 C++。至于错误,我认为已经发布的答案显示了您的错误假设。

#include <iostream>
#include <cstdlib>
#include <locale>
#include <set>
#include <algorithm>

int main()

        std::string name;
        std::cin>>name;

        std::set<char> vowels='a','u','i','e','o';
        std::transform(name.begin(), name.end(), name.begin(), [](auto v) return std::tolower(v, std::locale()););

        auto iter=std::remove_if(name.begin(), name.end(), [&vowels](auto v) return vowels.find(v)!=vowels.end(););
        name.erase(iter,name.end());

        for (int i = 0 ; i < name.length() ; i++)
        
                std::cout<<'.'<<name[i];
        
        return EXIT_SUCCESS;

【讨论】:

几乎完美。我还建议进一步优化上述内容,将 for 循环和 std::copy 名称删除到 std::ostream_iterator(std::cout, " ")

以上是关于元音的字符串操作未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Webhook 响应上的 Google 操作提示链接 URL 未按预期工作

具有休眠 CRUD 操作的 Spring 3 注释:@Autowired 未按预期工作

iOS:到 NSArray 的 JSON 字符串未按预期工作

Vigenere Cipher Key 未按预期工作

C中的无符号字符未按预期工作

Symfony 2 树枝拆分功能未按预期工作