我正试图从用户那里得到输入并输出输出,直到他/她按'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)
混合在各种输入方法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.