为什么字符串在C ++中变成整数?

时间:2014-11-06 21:41:59

标签: c++

#include <iostream>
using namespace std;
int main () {
    int N;
    cout << " Input an integer:";
    cin >> N;
    cout << " The integer entered is:" << N << endl;        
}

当我输入一个Integer时,它会返回相同的值但是当我输入hello时,它会给我1961729588

4 个答案:

答案 0 :(得分:13)

字符串不是整数,std::cin操作失败,输出的是最初在N中的垃圾值。将N初始化为0,并输入“hello”,您应该看到0作为输出。

答案 1 :(得分:5)

  

“当我输入一个Integer时,它会返回相同的值但是当我输入hello时,它会给我1961729588?。”

当给出无法转换为整数的输入时,cin >> N;实际上无法为流状态返回false。您可以使用

检查此类错误情况
 if(!(cin >> N)) {
     cerr << "Input a valid number!" << endl;
 }
 else {
     cout << " The integer entered is:" << N << endl;
 }

N的值将被初始化(重置)为int()(默认值),实际呈现为0


Full live sample

#include <iostream>
using namespace std;
int main () {
    int N;
    cout << " Input an integer:";
    if(!(cin >> N)) {
        cout << "Input a valid number!" << endl;
        cout << "N = " << N << endl;
    }
    else {
        cout << " The integer entered is:" << N << endl;
    }
    return 0;
}

输入

Hello

输出

Input an integer:Input a valid number!
N = 0

使用Ideone code sample

进行交叉检查

我无法重现获取某些垃圾值,如1961729588std::istream& operator>>(std::istream&, int&);输入运算符正确地重置了该值。


这是您当前编译器的实现,c ++标准级别(-std=c++11)设置的问题吗?

我在cppreference.com找到了关于c ++标准的最终差异的一些注释:

enter image description here

enter image description here

虽然我没有发现他们真正引用的是'上面描述的值',但说实话。

答案 2 :(得分:3)

输入非整数时,输入失败。当输入失败时,N保留其未定义的原始值,即写入未定义的行为。你应该测试你的输入,例如:

if (std::cin >> N) {
    // do something with the successful input
}
else {
    // deal with the input failure
}

答案 3 :(得分:1)

当您输入cin >> N;时,编译器会将N声明为int。因此,您的程序将调用一个函数,该函数将尝试从int读取代表cin的文本,并将结果存储在N中。

为此,它会尽可能多地读取cin中的数字字符,并在遇到非数字字符时停止。

例如,如果您输入32\n,您的程序会显示3,然后是2,然后是\n。当它看到\n它停止阅读时,因为\n不是数字。该程序将\n重新推送到流(如果我们想稍后阅读)并将{32}存储在N中。

假设您输入了"hello"之类的单词,而不是数字。您的程序将显示h然后停止,因为h不是数字。 h将被推回到流上(稍后将阅读),并且N中不会存储任何内容。 cin将返回错误,因为没有读取数字字符。

这仍然不能解释1961729588的价值。

注意N从未初始化。根据C ++标准,未初始化的自动变量的值是未定义的。因此N的值将是一些垃圾值。在你的情况下,这是1961729588。