为什么如果输入是字符,然后在c++中存储为整数,那么cin会得到奇怪的值?

Why does cin get strange values if input is a character and then stored in an integer in C++?

本文关键字:cin 那么 整数 字符 输入 如果 然后 存储 c++ 为什么      更新时间:2023-10-16

我正在学习c++并使用以下示例编写一些代码:http://doeaccmantra.blogspot.it/2013/09/doeacc-mantra-learning-point-blog-for.html

我有这样的代码:

// http://doeaccmantra.blogspot.it/2013/09/doeacc-mantra-learning-point-blog-for.html
/*
 * Prompt user for two integers and print their sum (Add2Integers.cpp)
 */
#include <iostream>
using namespace std;
int main() {
   int integer1; // Declare a variable named integer1 of the type integer
   int integer2; // Declare a variable named integer2 of the type integer
   int sum;      // Declare a variable named sum of the type integer
   cout << "Enter first integer> ";   // Display a prompting message
   cin >> integer1;                   // Read input from keyboard (cin) into integer1
   cout << "Enter second integer> ";  // Display a prompting message
   cin >> integer2;                   // Read input into integer2
   sum = integer1 + integer2;         // Compute the sum
   // Print the result
   cout << "The sum of " << integer1 << " and " << integer2
        << " is " << sum << endl;
   return 0;
}

你能解释一下为什么如果给我一个字符作为输入,我有这个结果吗?

Enter first integer> s
Enter second integer> The sum of 0 and 4283950 is 4283950

我学习像PHP和JS这样的语言,类型不匹配是一个致命的错误。

这不是c++的情况吗?所以"s"被解释为一个数字?

而且,在这种情况下,代码似乎忽略了第二个cin…

我想这个问题应该结束了,但我只想澄清这个(有趣的)问题

当您输入一个字母时,流提取失败并且流处于错误状态。这也意味着integer1integer2都未初始化,这解释了为什么在使用它们时看到垃圾值。

有检查流状态的成员函数(good(), eof(), fail(), bad())。我认为最简单也是最正确的方法是:

if (cin >> integer1) {
    // success
} else {
    // failure
}

s未被读取并赋值给int。您看到的值是在您尝试读取流之前var的值。对流的两个调用都失败,因为流仍然是错误的,你需要在再次读取它之前清除它。

试试这个:

int integer1 = 0; // init your var
int integer2 = 0; // init your var
while (!(cin >> integer1))
{
    cout << "Please enter a valid integer value";
    cin.clear();
}