cin.get在while循环中

Can*_*ncü 1 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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

Hello
Again? (y/n)
y 
Again? (y/n)
y 
Again? (y/n)
n
Again? (y/n)
n 
...  
Run Code Online (Sandbox Code Playgroud)

Jos*_*osh 5

混合在各种输入方法istream(get,getline,operator>>)可以,如果你不知道哪些是充满了危险方法离开流中的分隔符,并且不这样做,并相应地处理它们.

在这种情况下,get将读取300个字符的输入或输入直到换行符,以先发生者为准.新行不会被提取,因此将保留在流中.这意味着您的来电scanf()将读取新行和停止,离开y或者n你刚刚输入的流.

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

这使用std::string和非成员getline读取输入的方式不要求您限制为300个字符(严格来说不是与问题相关,而是通常的好习惯).getline消耗并丢弃分隔符,但是get,用于读取延续输入,不会,因此我们手动丢弃它ignore.