为什么字符'a'不会自动转换为97?

时间:2012-11-13 14:18:44

标签: c++ integer character inputstream

char input1;
std::cout << "input1 : ";
std::cin >> input1;

int input2;
std::cout << "input2 : ";
std::cin >> input2;

std::cout << input1 << std::endl;
std::cout << input2 << std::endl;

return 0;

我在input1写了'a',在input2写'a'。

Ouput is like this.
input1 : a
input2 : a
a
-858993460

我好奇......'一个'章程在十九月份是97。为什么打印-858993460? 'a'不会自动转换为97?为什么呢?

5 个答案:

答案 0 :(得分:18)

a,作为字符串,不能通过以下规则int转换为std::cin。请注意:a不是基数为10的有效整数。std::cin无法将字符串 "a"转换为int

它打印-858993460的原因是因为int未初始化,所以它可以打印任何内容,或者什么都不打,或者做任何想做的事情(查找未定义的行为)。

尝试这样的事情:

char input2_chr;
std::cin >> input2_chr;
int input2 = input2_chr;

答案 1 :(得分:6)

我认为输入完全失败了,您看到的值是未定义行为的结果(input2从未被写入)。

如果您尝试读取整数,则字符“a”无效,因此>>运算符不会接受该字符。

您似乎在某种程度上期望输入应该将字符转换为该字符的ASCII代码,以便为您提供所请求的整数类型的结果。语言不支持这种推理。

答案 2 :(得分:3)

在第一个中,你要求输入一个字符,所以你得到了第一个字符 流中的非空白字符。在第二个,你问 输入一个整数,因此流会跳过空格(就像它一直一样 >>)并尝试解析整数。由于"a"不能成为。{1}} 开始一个整数值,流设置一个错误状态( failbit)并返回,没有修改input2。当你输出 未初始化的变量,您有未定义的行为。 (你应该 从不使用您输入的变量而不先检查是否 输入成功与否。)

根据您的描述,听起来您正在尝试输入一些内容 二进制格式。为此,您必须以二进制模式打开流, 确保它充满了"C"语言环境,然后使用 istream::getistream::read。 (当然,你必须知道什么 二进制格式是您正在阅读,以便能够 将您读取的未格式化字节转换为您的实际信息 所需要的。)

答案 3 :(得分:3)

例如Aardvard already has answered,您在C ++标准中看到一个名为 indeterminate value 的任意原始值,因为输入操作失败并且input2未分配新值。< / p>

要输出char变量值的十进制表示,只需将其转换为int,以指示输出流视为整数。

将其转换为int的最简单方法是通过在表达式中使用变量来鼓励隐式提升,例如只需在前面添加+符号它:

#include <iostream>
using namespace std;

int main()
{
    char const  ch  = 'a';
    cout << "'" << ch << "' = " << +ch << endl;
}

输出:

'a' = 97

答案 4 :(得分:2)

因为您正在读取input2处的整数。 a不是整数。因此,不会读取任何内容,并且将保留input2的原始值。

在这种情况下,它将是一些随机值,因为input2未初始化。

您可以通过选中cin.good()

来检查读取是否成功