Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中使用std::cin将字符传递给int+;_C++_Loops_C++11_Integer_Iostream - Fatal编程技术网

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');
    }
}