我有这个简单的程序,基本上接受用户输入并将其输出到屏幕。输入整数时,该程序工作正常。但是,当我输入字符串文字时,将获得此负整数作为输出。 (-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)为什么程序没有给我编译错误,语法错误或崩溃?相反,为什么要继续输出那个整数呢?
抱歉我的英语不好。
答案 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);
}
*如果您希望std::cin
在失败时抛出异常,那么您可以使用basic_ios::exceptions
来执行此操作:
std::cin.exceptions(std::istream::badbit | std::istream::failbit);
答案 1 :(得分:1)
已经有了一个很好的答案。我只是想补充第二个问题
2)为什么程序没有给我编译错误,语法错误, 还是撞车?相反,为什么要继续输出那个整数呢?
错误?
编译器无法知道用户将写什么。它可能是可以流式传输到$supplier->meta->field_name, or $supplier->meta()->field_name
的东西,但也可能是它不能。因此编译器在这种情况下没有机会发出警告/错误。
碰撞?
如果此代码导致崩溃,则无法使用int
编写无法通过格式错误的用户输入崩溃的代码。这会使cin
变得毫无用处。
结论
您有责任检查输入操作是否正常,如果没有,则做出相应的反应。
答案 2 :(得分:-3)
您将用户输入存储在int中。 我建议你将输入字符串转换为int,如同 std :: cin&gt;&gt;的atoi(一);