我正在尝试从用户那里获得输入并输出输出,直到他/她按下'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
...
答案 0 :(得分: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;
}
这使用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数组。