输出时获得奇怪的值

时间:2017-05-23 13:26:08

标签: c++

我有这个简单的程序,基本上接受用户输入并将其输出到屏幕。输入整数时,该程序工作正常。但是,当我输入字符串文字时,将获得此负整数作为输出。 (-858993460),无论任何字符串输入大小。

我目前正在使用Visual Studio 2015社区版,如果这很重要。

这是我的代码。

#include "stdafx.h"
#include <iostream>
#include <string>


int main() {
   int a;
   std::string b;
   b = "Type something";
   std::cout << b << std::endl;
   std::cin >> a;
   std::cout << "You said " << a << std::endl;
}

我试过搜索但无济于事。因此,我有两个问题。

1)当我给它一个字符串输入时,为什么输出这个特定的负整数?

2)为什么程序没有给我编译错误,语法错误或崩溃?相反,为什么要继续输出那个整数呢?

抱歉我的英语不好。

3 个答案:

答案 0 :(得分:1)

  

1)当我给它一个字符串输入时,为什么输出这个特定的负整数?

因为你的整数没有被初始化为任何东西,所以它输出任何东西(像int这样的原语在函数级范围声明时不会得到默认值)。从流中读取整数失败,因为您提供了字符串文字,因此未更改整数值。如果您将整数的值初始化为42,则会在打印时将其值保持不变(until C++11. After C++11 the value will become 0)。

  

2)为什么程序没有给我编译错误,语法错误或崩溃?相反,为什么要继续输出那个整数呢?

stream迫使程序员检查发生了什么(通常为*)。他们隐含了对布尔值的转换,因此您可以方便地检查是否有任何问题。

尝试像这样扩充您的代码:

std::cin >> a;
if (!std::cin)
{
   std::cerr << "Failed to read!" << std::endl;
   exit(1);
}

Demo1

*如果您希望std::cin在失败时抛出异常,那么您可以使用basic_ios::exceptions来执行此操作:

std::cin.exceptions(std::istream::badbit | std::istream::failbit);

Demo2

答案 1 :(得分:1)

已经有了一个很好的答案。我只是想补充第二个问题

  

2)为什么程序没有给我编译错误,语法错误,   还是撞车?相反,为什么要继续输出那个整数呢?

错误?

编译器无法知道用户将写什么。它可能是可以流式传输到$supplier->meta->field_name, or $supplier->meta()->field_name 的东西,但也可能是它不能。因此编译器在这种情况下没有机会发出警告/错误。

碰撞?

如果此代码导致崩溃,则无法使用int编写无法通过格式错误的用户输入崩溃的代码。这会使cin变得毫无用处。

结论

您有责任检查输入操作是否正常,如果没有,则做出相应的反应。

答案 2 :(得分:-3)

您将用户输入存储在int中。 我建议你将输入字符串转换为int,如同 std :: cin&gt;&gt;的atoi(一);