【问题标题】:C++ copying out all the vowels of a string in another string | How to copy a char type in a string?C++ 将一个字符串的所有元音复制到另一个字符串中 |如何在字符串中复制char类型?
【发布时间】:2019-06-25 09:37:21
【问题描述】:

我正在尝试获取字符串的所有元音,并按照它们出现的顺序将它们复制到不同的字符串中。字符串只能是一个单词(没有空格)和小写英文字母。

示例:如果我输入“informatics”,我希望输出“oai”。

当我运行编译器时,我在 cmd 框中得到一个 std::out of range 错误

这是我的代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s, s2;
    int i, j;
    char c;
    cout << "Introduceti sirul de caractere: "; cin>>s;

    j=0;
    for(i=0; i<s.length(); i++)
        switch(s.at(i))
    {
        case 97: {j++; c=97; s2.at(j)=c;}
        case 101: {j++; c=101; s2.at(j)=c;}
        case 105: {j++; c=105; s2.at(j)=c;}
        case 111: {j++; c-111; s2.at(j)=c;}
        case 117: {j++; c=117; s2.at(j)=c;}
    }

    cout<<s2;
    return 0;
}

我假设问题在于在第二个字符串中复制元音本身,那么它通常是如何完成的呢?例如,我不能只拥有一个 s2.at(j)=a,因为它会说变量 a 没有被声明(当然),但我也假设我不能只说它等于元音的 ASCII 码,或者我可以吗?我什至不知道。所以我尝试当场更改具有该元音的变量,然后将其放入字符串中,但出现错误。

【问题讨论】:

  • 我认为您在switch 声明中缺少breaks
  • 请澄清:鉴于“快速棕色狐狸”的预期输出是什么?
  • 您从未正确分配您的s2 字符串,因此您无法复制/替换那里的任何内容。同样正如@ForceBru 提到的,缺少break; 语句。
  • 97 和其他神奇数字是什么意思?我猜你的意思是'a'
  • 强烈建议使用字符 'a' 而不是原始 ASCII 码。 1) 对于普通读者来说,推断'a' 的意图要比97 容易得多。 2)更容易发现错误,比如不小心使用了错误的代码。 3) 目标系统可能是少数不使用 ASCII 的系统之一。

标签: c++ string char ascii


【解决方案1】:

更简单,跳过开关(另外,不要忘记大写):

#include <iostream>
#include <string>

using namespace std;

int main()
{
    const auto vowels = "aeiouAEIOU"s;

    cout << "Introduceti sirul de caractere: \n"; 

    auto input = string();
    if( getline( cin, input ) )
    {
        cout << "Recieved: " << input << "\n";

        auto output = string();
        for( const auto c : input )
        {
            if( vowels.find(c) != string::npos )
            {
                output.push_back(c);
            }
        }

        cout << output;
    }
}

查看它在 Coliru 上的实时运行。

有些人会争辩说,应该使用标准库中的std::copy_if(),而不是手动循环:

copy_if( begin(input), end(input), back_inserter(output), 
         [&]( auto c ) { return vowels.find(c) != string::npos; } );

查看该版本在 Coliru 上实时运行。

【讨论】:

  • 这是auto s = string(); 不是auto 疯了吗?为什么不string s;
  • @NeilButterworth:在这么大的程序中,这并不重要。作为代码库中的习惯和一致性问题,它确实如此。我是“Almost Always Auto”风格的粉丝,我在代码中始终如一地使用它,以便类型在右侧。在提供的链接中查看 #4 中的其他参数。
  • 好吧,我不喜欢这种风格,而且我认为它使代码,即使对于这个简短的示例,可读性也大大降低。看看吧!往下看左边的代码,你无法分辨出任何东西的类型。
  • 这已经失控了,但是知道变量的类型是阅读和理解代码的关键。如果我看到类似auto a = f(); 的内容,我不知道a 是什么,除非我追查f 是什么,这说起来容易做起来难。无论如何,这是我关于这个主题的最后一句话。
  • @SerkanT.:对不起,我误解了你的第一条评论的意思。 *高五*
猜你喜欢
  • 2022-11-30
  • 2012-05-09
  • 1970-01-01
  • 2014-05-26
  • 2013-04-14
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多