C++ 在C+中使用std::cin将字符传递给int+;
我在一个练习中遇到问题,该练习要求我接收两个整数并打印它们。但是,当用户输入条目C++ 在C+中使用std::cin将字符传递给int+;,c++,loops,c++11,integer,iostream,C++,Loops,C++11,Integer,Iostream,我在一个练习中遇到问题,该练习要求我接收两个整数并打印它们。但是,当用户输入条目“|”时,程序结束。然而,我正在测试这个,程序进入一个无限循环。 有什么问题 #include <iostream> using namespace std; int main () { int i1 = 0, i2 = 0; cin >> i1; cin >> i2; while (i1 != int('|') && i2 != int('|'
“|”
时,程序结束。然而,我正在测试这个,程序进入一个无限循环。
有什么问题
#include <iostream>
using namespace std;
int main ()
{
int i1 = 0, i2 = 0;
cin >> i1;
cin >> i2;
while (i1 != int('|') && i2 != int('|'))
{
cout << i1 << endl;
cout << i2 << endl;
cin >> i1 >> i2;
}
return 0;
}
#包括
使用名称空间std;
int main()
{
inti1=0,i2=0;
cin>>i1;
cin>>i2;
而(i1!=int('|')和&i2!=int('|'))
{
couti2;
}
返回0;
}
当您std::cin
循环中的非整数类型(charector“|
”)时,它会失败。使用检查
例如,运行以下命令,您将了解发生这种情况的原因:
while (i1 != int('|') && i2 != int('|'))
{
std::cout << i1 << endl;
std::cout << i2 << endl;
std::cin >> i1 ; // std::cin fails here, in the the case of '|'
if(std::cin.fail()) { std::cout << "Failed"; break;}
std::cin >> i2; // std::cin fails here, in the the case of '|'
if(std::cin.fail()) { std::cout << "Failed"; break;}
}
更新:正如@AJNeufeld指出的,而(i1!=int(“|”)&i2!=int(“|”)
将无法读取124
,即使输入是整数(等于垂直管道字符的ASCII码)
一种可能的解决方案是将这两个值作为字符串读取,检查“
|
”字符,如果不存在,将字符串转换为整数,或报告错误或中断循环。(归功于@AJNeufeld)当您使用>
从istream
提取值时,将从表达式返回原始流。这意味着您可以替换此代码
std::cin >> i1;
std::cin >> i2;
使用此代码:
std::cin >> i1 >> i2;
该表达式的结果同样是原始的istream
,当在布尔上下文中使用时,如果流处于“fail”状态,则返回false
。因此,我们可以读取两个整数,并测试在一个简单构造中是否成功:
if( std::cin >> i1 >> i2 ) {
std::cout << i1 << "\n" << i2 << "\n";
} else {
你需要读一些好的文章。下一个投票者,而不是下一个投票者,请解释我们的新来者他的问题有什么问题,以及何时/如何在StackOverflow中提问。不要输入
字符,试着输入数字124。你的程序应该退出,而不是永远循环。是的,但问题仍然很有趣。。。当接收到无效输入时,为什么在“|”流进入失败状态的情况下发生无限循环;在清除该错误状态之前,它不会恢复。谢谢您的回答。这很有帮助。如果用户为i1或i2输入124
,您的第一个“正确修复”将失败!该版本和“可选”版本都将在任何无效输入(如“x”)上失败(终止循环),而不是仅在给定“|”时失败。OP ASQUEST for:当用户输入条目“|”,即。按char键时,OP需要一个循环中断,而不是整数(124
)。选择“可能”这个词是错误的。对不起,我误导了你。我的意思是,在std::cin
失败的情况下打破循环。从问题描述和OP的尝试while(i1!=int(“|”)&&i2!=int(“|”){…}
来看,退出条件应该是“|”字符,而不仅仅是任何无效的输入。为清楚起见,124==int(“|”)
和124==static_cast(“|”)
都是真的,因为垂直管道字符的ASCII码是124。因此,循环将在124的有效整数输入上意外中断。这是一个完美的解决方案。(+1)
if( std::cin >> i1 >> i2 ) {
std::cout << i1 << "\n" << i2 << "\n";
} else {
} else {
std::cin.clear(); // reset the fail state
if (std::cin.peek() == '|') {
std::cout << "Found end of input marker (|)\n";
} else {
std::cout << "Invalid input!";
}
// skip all characters in the stream up to the end of the current line.
std::cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
}
while ( !std::cin.eof() ) {
if( std::cin >> i1 >> i2 ) {
std::cout << i1 << "\n" << i2 << "\n";
} else {
std::cin.clear(); // reset the fail state
if (std::cin.peek() == '|') {
std::cout << "Found end of input marker (|)\n";
break;
} else {
std::cout << "Invalid input!";
}
// skip all characters in the stream up to the end of the current line.
std::cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
}
}