读取字符串中的字符以仅输出C ++中的元音

时间:2016-03-02 18:07:03

标签: c++

我正在尝试取一个用户输入的字符串,遍历字符串中的每个字符,然后只打印元音。

我已经发布了到目前为止我所拥有的内容,但当然它所做的只是输出字符串中的第一个字符,无论它是否是元音(只是FYI,这是一个类,所以我'我不是在找人给我答案,但我肯定需要一些指导!)

#include <iostream>
#include <cstdlib>
#include <string>
#include <iomanip>

using namespace std;

int main()
{
    string userString;
    char vowels = ('a','e','i','o','u');
    char stringArr = userString[0];

    cout << "Enter some text: ";
    cin >> userString;
    cout << endl;

    if (stringArr == 'a'|'e'|'i'|'o'|'u')
        cout << userString[0] << " " << endl << endl;
    else
        cout << "No vowels found.";

return 0;
}

2 个答案:

答案 0 :(得分:0)

首先,您的数组声明语法不正确。

由于您使用的是C ++,因此您应该将内置array类用于静态(固定长度)数组。

初始化数组的正确方法是使用以下语法:

std::array<char, 5> vowels = { 'a', 'e', 'i', 'o', 'u' };

接下来,这种语法也没有按照你的想法行事:

if (stringArr == 'a'|'e'|'i'|'o'|'u')

|实际上是一个二进制文件,或者意味着它正在进行位操作,这不是你想要的。另外,你声明元音然后重新陈述这个if语句中的所有元音是很奇怪的。 不要重复自己!使用您已经制作的列表并搜索它。它使您的代码更容易维护。

搜索array(以及许多其他容器类)的标准方法是使用find函数。

c = 'a'; // some character
find(vowels.begin(), vowels.end(), c) != vowels.end()

这意味着如果在true中找到c,它将返回vowels

所以现在我们只需要浏览所有用户输入的字符串的字符。为此,您需要使用循环。在C ++中,有一种称为range-based for loop的东西。语法如下:

for (auto c : user_string)
{
    // do something with c
}

这将迭代整个字符串,并为每个字符执行块({ })内的代码。

以下是完全符合您要求的工作代码:

#include <iostream>
#include <cstdlib>
#include <string>
#include <iomanip>
#include <array>
#include <algorithm>

using namespace std;

int main()
{
    bool vowels_found = false;
    string user_string = "yea man";
    array<char, 5> vowels = { 'a', 'e', 'i', 'o', 'u' };

    for (auto c : user_string)
    {
        if (find(vowels.begin(), vowels.end(), c) != vowels.end())
        {
            cout << c;

            vowels_found = true;
        }
    }

    if (!vowels_found)
    {
        cout << "No vowels found.";
    }

    return 0;
}

答案 1 :(得分:0)

看来你的意思如下:)

#include <iostream>
#include <string>

int main()
{
    while ( true )
    {
        std::cout << "\nEnter some text (Enter - exit): ";

        std::string userString;

        if ( !std::getline( std::cin, userString ) || userString.empty() ) break;

        const char *vowels = "AaEeIiOoUu";

        bool present = false;

        for ( std::string::size_type pos = 0;
              ( pos = userString.find_first_of( vowels, pos ) ) != std::string::npos;
              ++pos )
        {
            if ( !present ) present = true;
            std::cout << userString[pos] << ' ';
        }

        if ( !present ) std::cout << "No vowels found.";

        std::cout << std::endl;
    }       

    return 0;
}

程序输出可能看起来像

Enter some text (Enter - exit): Hello World!
e o o 

Enter some text (Enter - exit): Hll Wrld!
No vowels found.

Enter some text (Enter - exit): hEllO wOrld!
E O O 

Enter some text (Enter - exit): 

至于你的代码那么它没有多大意义。:)

例如在此声明中

char vowels = ('a','e','i','o','u');

使用了逗号运算符,变量vowels将具有值'u'

或此声明

char stringArr = userString[0];

使用终止零初始化stringArr(假设代码编译为C ++ 2011)

或if语句中的条件

if (stringArr == 'a'|'e'|'i'|'o'|'u')

始终评估为true,因为至少'e'不等于0.