将C ++输入与数组值进行比较

时间:2010-05-14 23:16:03

标签: c++

在过去的几个月里,我一直在缓慢但肯定地在C ++中跋涉,而且我遇到了一个障碍,我一直想弄明白。我试过询问/阅读/搜索,但我找不到合适的答案。也许这仅仅是因为这个问题很难提出来。

我正在尝试做的是在我的程序结束时,让结束序列将输入值与Array中的值进行比较。我是否需要循环比较序列?这有更简单的方法吗?

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

int main () {

    string YesAnswers[5] = {"Y", "YES", "yes" "y"};
    string Name;
    string YN;

    do {
        cout << "Enter your name: ";
        getline(cin, Name);

        cout << "Your name is "<< Name;

        cout <<"\nIs this correct? Y\N: ";
        cin >> YN;

    } while(YN == YesAnswers);

    system("Pause");
    return 0;
}

4 个答案:

答案 0 :(得分:4)

您可以使用std::find()中的<algorithm>

while (std::find(YesAnswers, YesAnswers + 4, YN) != YesAnswers + 4);

或者,如果您要YesAnswers vector或其他容器而不是数组:

std::vector<std::string> YesAnswers;

while (std::find(YesAnswers.begin(), YesAnswers.end(), YN) != YesAnswers.end());

std::find()查找范围内的元素;如果找到该元素,它会向找到的元素返回一个迭代器(或一个指针,如果是数组);如果找不到该元素,则返回一个迭代器(或指针)到该范围的末尾。

请注意,与大多数(全部?)标准库算法一样,范围在开始时关闭,但在结束时打开。也就是说,“end”迭代器/指针应该指向一个接一个的元素。

答案 1 :(得分:0)

您可以使用std::set。集合是有序的,因此对于大量元素来说比std::vector更快找到东西但是在你的情况下你只有4,所以它可能没有什么区别。由于集合是为快速查找而设计的,因此它们实际上拥有自己的find成员,因此您不必使用std::find。因此,将YesAnswers定义为

set< string > YesAnswers;
YesAnswers.insert( "Y" );
YesAnswers.insert( "YES" );
//... and so on

然后使用

检查YN
YesAnswers.find( YN ) != YesAnswers.end()

我仍然认为@James的答案更符合您的需求,因为您可以将YesAnswers保留为一行初始化而不是一组的多行插入。

答案 2 :(得分:0)

一般情况下,如果您想查找某个值是否是某个集合的成员,您必须循环或使用某些算法或集合成员函数,如其他答案所示。

在你的情况下,只有四种可能性,所以理论上你可以使用逻辑OR(运算符||)在条件中明确地检查所有这些。

在我看来,针对您的特定问题的最佳解决方案是从用户处获取输入,将其转换为大写(例如检查here如何)并将其与仅两个字符串“Y”进行比较或“是”。

答案 3 :(得分:0)

一些事情:您可以在同一行声明相同类型的变量,例如:

string Name,YN;

您实际上可以声明一个布尔值,为您的循环初始化为True,并在给定一组条件的情况下将其更改为False。 **(C ++将任何非0值视为True,将0视为False,因此如果需要,您实际上可以将Integer用作布尔值。)

Bool IsYourName = True;

DO {

...

IsYourName = False;

for(int i = 0; i&lt; YesAnswers.size(); i ++)

 if (YN == YesAnswers[i])

     IsYourName = True;

}

while(IsYourName);

这是考虑接近循环的另一种方式