创建一个删除元音的函数

Posted

技术标签:

【中文标题】创建一个删除元音的函数【英文标题】:Creating a function to remove vowels 【发布时间】:2020-03-18 02:19:51 【问题描述】:

我正在尝试创建一个函数来从带有空格的字符串(不是 cstring)中删除元音。 我需要将字符串传递给函数并将每个辅音添加到另一个字符串,该字符串将返回没有元音的字符串。我需要保留既有元音又有辅音的原始字符串。我坚持如何检查并在返回的字符串中添加辅音。 例如:输入:亚历山大·汉密尔顿 输出:lxndr Hmltn

#include <iostream>
 #include <string>
using namespace std;

string removeVowels(string input, int size);

int main()

    string input;
    string vowlessFinal;
    getline(cin, input);
    cout << input;
    vowlessFinal = removeVowels(input, 20);
    cout << vowlessFinal;



string removeVowels(string input, int size) 
    string vowlessFinal;
    int j = 0;
    for (int i = 0; i < input.size(); i++) 
     //i have just 'a' below but i need to have the rest (including caps)   
    if (input.at(i) != 'a') 
            vowlessGuess.at(j) = input.at(i);
            j++;
        
    
    return vowlessFinal;

【问题讨论】:

您需要更改输入或返回输出。为了改变输入,你需要一个参考。基本功能的东西。 在抛出 'std::out_of_range' 实例后调用终止 what(): basic_string::at: __n (即 1) >= this->size() (即 1) 没有元音就是:中止 如果它运行,那么它编译成功,但是你有错误。不过,这是一个介绍性调试错误。索引超出范围意味着索引超出范围。学习如何使用 std::string 类,尤其是 size() 函数,它告诉你字符串有多长。 这不是编译器错误。你说它不会编译。您在这里写的错误是因为vowlessGuess 没有足够的空间分配给它。请改用string::push_back。或者可能是size 大于input.size() 这是一种使用现代语言特性的方法:godbolt.org/z/stsqFy 【参考方案1】:

这应该涵盖所有情况。原始字符串的引用传递,以及要更改的字符串,它应该是调用者声明的空字符串:

void removeVowels(const std::string& input, std::string& result) 
    bool test = false;
    const std::string targets = "aAeEiIoOuU";
    for (const char& letter: input) 
        for (const char& target: targets) 
            if (target == letter)                #test each vowel against string
                test = true;                      
                break;                            #exit loop if found
            
        
        if (!test) 
            result.push_back(letter);             
        
        test = false;
    
    return result;

策略是'如果测试字母在任何元音上匹配,则设置标志并退出循环;如果不是标志,则将该字母添加到新字符串中;为下一个元音循环重置标志。'

【讨论】:

【参考方案2】:

嗯。我想知道人们是否不知道,或者是否有其他原因,但是 C++ 有一个专门的功能可以用其他东西替换某些东西:std::regex_replace

您可以用它替换任何模式并将结果分配给新字符串。然后你就可以使用一个班轮:

请看下面的例子:

#include <iostream>
#include <string>
#include <regex>

int main() 

    // The test string
    std::string input"The quick brown fox jumps over the lazy dog.";

    // Use simply the replace function
    std::string output = std::regex_replace(input, std::regex("[aeiouAEIOU]"), "");

    // SHow the output
    std::cout << output << "\n";

    return 0;

另请参阅this answer。你可以计算,如果一个字母是元音。

【讨论】:

以上是关于创建一个删除元音的函数的主要内容,如果未能解决你的问题,请参考以下文章

循环“忘记”以删除一些项目[重复]

javascript 从字符串中删除元音

c语言 设计一个函数判断一个字符是不是为元音

删除Web2.0应用程序的元音

尝试删除字符时陷入无限循环

用js将字符串中的元音字母删除并返回新数组