cin.get在while循环中

时间:2011-02-08 17:53:00

标签: c++ loops input

我正在尝试从用户那里获得输入并输出输出,直到他/她按下'n'。它似乎不起作用。 scanf或cin.get中有问题吗?当我按y时它只需要“tekrar”作为输入,因此将“y”作为输出并进入循环。此外,当我将n作为tekrar输入时,不会停止。

char cevap[300]="";
char tekrar='y';
while (tekrar!='n')
{
  cin.get(cevap,300);
  cout<<cevap<<endl;
  cout<<"Again? (y/n)";
  scanf("%c",&tekrar);
}

输出:

Hello
Again? (y/n)
y 
Again? (y/n)
y 
Again? (y/n)
n
Again? (y/n)
n 
...  

2 个答案:

答案 0 :(得分:5)

如果您不知道哪些方法会离开分隔符,那么在istreamgetgetlineoperator>>)上混合各种输入法可能会非常危险流中的字符,但没有,并相应地处理它们。

在这种情况下,get将读取300个字符的输入或输入,直到换行符为止,以先发生者为准。新行不会被提取,因此将保留在流中。这意味着,您对scanf()的通话将会读取换行符并停止,只需在流中输入yn

有几种方法可以重新组织此代码,使其按照您的需要进行操作。这是一种方式:

#include <iostream>
#include <string>

using namespace std;
int main()
{
    string cevap;
    char tekrar='y';
    while (tekrar!='n')
    {
      getline(cin,cevap);
      cout<<cevap<<endl;
      cout<<"Again? (y/n)";
      tekrar = cin.get();
      cin.ignore();
    }

    return 0;
}

这使用std::string和非成员getline来阅读输入,以便不要求您限制为300个字符(严格来说不是与问题相关,而是良好做法通常情况下)。 getline使用并丢弃分隔符,但用于读取延续输入的get则没有,因此我们通过ignore手动丢弃它。

答案 1 :(得分:3)

使用cin运算符&gt;&gt;从stdin读取,而不是scanf:

string cevap;
char tekrar='y';
while (tekrar!='n')
{
  getline(cin, cevap);
  cout<<cevap<<endl;
  cout<<"Again? (y/n)";
  cin >> tekrar;
  cin.get();
}

编辑:修复了无限循环。您应该使用std :: string而不是简单的char数组。