从控制台输入C ++,比较整数

时间:2011-08-06 21:36:43

标签: c++ visual-studio visual-studio-2010 visual-c++

bool choose() {
    int answer = 0;
    while(answer != 1 || answer != 2) {
        cout << endl << "Do you want to encrypt(enter 1) or decrypt(enter 2)?" << endl;
        cin >> answer;
    }
    if(answer == 1) return true;
    return false;
}

从行读取并将输入与整数进行比较的最佳方法是什么? 我知道方式cingetsgetline(cin, answer)。 我应该使用哪个以及为什么?

目前,这种方式无效,因为当我输入1或2时,它仍然保留在while

3 个答案:

答案 0 :(得分:10)

您的情况不正确。到De Morgan's laws,您应该使用&&代替。

while(answer != 1 && answer != 2) {

答案 1 :(得分:5)

您正在正确阅读该值。但是,循环条件错误;它应该是

while(answer != 1 && answer != 2)

使用||使条件始终为真,因为没有数字等于1和2。

答案 2 :(得分:3)

此代码非常适合do-while循环,如果您使用它,则不需要初始化变量answer

int answer; //= 0; no need to initialize!
do {

  cout<<"Do you want to encrypt(enter 1) or decrypt(enter 2)?"<<endl;
  cin >> answer;

}while(answer != 1 && answer != 2);

当然,你需要使用&&,正如其他人已经指出的那样。 : - )

顺便说一句,如果用户输入任何非整数输入,如hgjkhg,会发生什么? cin>>answer无法读取输入,它将永远保留在那里,cin的标志将被设置为失败,cin将无法读取更多输入。这意味着,循环永远不会退出!

为了避免这种情况,并且为了使代码更加健壮和完整,您应该将其编写为:

int answer = 0; 
while(answer != 1 && answer != 2) {

  cout<<"Do you want to encrypt(enter 1) or decrypt(enter 2)?"<<endl;
  if ( !(cin >> answer) )
  {
    cin.clear(); //clear the failure flag if there is an error when reading!
    std::string garbage;
    std::getline(cin, garbage); //read the garbage from the stream and throw it away
  }
}

是。您可以使用while循环代替do-while。您只需在代码中添加if(!(cin>>answer)) { ... }即可。 : - )