解释一下当十进制值传递给整数变量时,cin是如何工作的。

18 浏览
0 Comments

解释一下当十进制值传递给整数变量时,cin是如何工作的。

int a, b;

cin >> a >> b;

cout << a << endl << b;

输入1:3.5 5.5

输入2:3 5.5

查看此代码

0
0 Comments

当将带有小数点的值传递给整数变量时,cin的工作原理如下:

1. 首先,cin会跳过空格、制表符和换行符(如果有的话)。

2. 然后,cin会读取连续的数字,直到遇到不同的字符(在这种情况下是小数点),并将这些数字解析为一个数值。

3. 在这个例子中,输入的值是"a",cin会将其解析为数字"3"。

4. 然后,当cin尝试读取第二个数字时,它仍然位于小数点的位置,但小数点与空格和数字不同,所以它不会读取任何字符,并将"b"赋值为"0",并设置failbit。

5. 根据C++的规范,在C++11之前,如果解析失败(例如,输入了一个字母而期望的是一个数字),则数值保持不变,并设置failbit;而在C++11及以后,如果解析失败,则将0写入数值,并设置failbit。

解决方法:将输入的值更改为整数或更改变量的类型为浮点数,以匹配输入的值。

感谢Tobi303在规范链接中提供的信息。

0
0 Comments

当将小数值传递给整数变量时,cin的工作原理是将输入视为一个文本字符串,并将该字符串转换为整数值。所以,字符串"3.5"代表的整数值是什么呢?它是3,就像输入为"3 5"一样:代码将读取尽可能多的文本,然后停止。之后发生的情况取决于导致转换停止的原因。如果遇到空格字符,一切正常。如果遇到其他字符(在这种情况下是"."),就会出现问题。

问题的出现原因是,当将小数值传递给整数变量时,cin会尝试将输入的文本字符串转换为整数值。然而,如果输入的字符串中包含小数点或其他非数字字符,cin会停止转换并导致错误。

解决这个问题的方法是在读取输入之前先检查输入的有效性。可以使用cin的.fail()函数来检查是否发生了错误。如果输入的字符串无效,可以清除错误状态并忽略输入。然后,可以使用cin.ignore()函数来跳过输入中的非数字字符,并继续读取下一个有效输入。

下面是一个示例代码,演示了如何解决这个问题:

#include 
int main() {
    int value;
    
    while (true) {
        std::cout << "Enter an integer value: ";
        std::cin >> value;
        
        if (std::cin.fail()) {
            std::cin.clear(); // 清除错误状态
            std::cin.ignore(std::numeric_limits::max(), '\n'); // 跳过输入中的非数字字符
            std::cout << "Invalid input. Please try again." << std::endl;
        } else {
            break;
        }
    }
    
    std::cout << "The entered integer value is: " << value << std::endl;
    
    return 0;
}

在上面的代码中,使用了一个无限循环来不断接收用户的输入。如果输入的字符串无效,将清除错误状态并忽略输入中的非数字字符。然后,代码会继续循环,直到接收到有效的输入为止。

通过这种方法,我们可以确保当小数值传递给整数变量时,程序不会出现错误,并且可以继续执行后续的操作。

0
0 Comments

cin 是 C++ 中的一个输入流对象,用于从标准输入设备(通常是键盘)获取用户输入的数据。当用户输入一个小数值(即带有小数点的数值)并将其传递给整数变量时,cin 的工作方式会产生一些问题。

在 C++03 及之前的版本中,代码的行为是未定义的。当遇到小数点时,流会停止读取,而变量 b 的值不会被修改。

从 C++11 开始,cin 会将变量 b 的值设置为 0;在此之前,b 的值不会被修改。因此,在读取失败的情况下读取其值是不合理的。

解决这个问题的一个好方法是始终使用以下代码:

if (cin >> a >> b){
    // 输入正确,继续处理
} else {
    // 解析错误
}

在 if 条件成立的情况下,可以确保变量 a 和 b 已经被正确赋值。

根据我所知,自从 C++11 版本起,如果读取操作失败,cin 会将变量设置为 0,并设置 failbit。因此,这不再是未定义行为。

另外,之前的回答中提到变量 b 在读取后是未初始化的,这是不正确的。在上述代码示例中,可以尝试初始化 b 为一个数字,然后在读取后,它将变为 0。

是的,确实,C++11 友好地将变量设置为 0。个人而言,我更喜欢之前的标准在这方面的处理方式。

0