3
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

我很好奇......'a'宪章是 97 年 12 月。为什么打印-858993460?'a' 不会自动转换为 97?为什么?

4

5 回答 5

18

aint, 作为一个字符串,不能通过以下规则转换为 an std::cin。考虑一下:ais not a valid integer in base 10.std::cin将无法将字符串 "a"转换为int.

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

尝试这样的事情:

char input2_chr;
std::cin >> input2_chr;
int input2 = input2_chr;
于 2012-11-13T14:21:58.190 回答
6

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

如果您尝试读取整数,则字符“a”无效,因此操作员不会接受它>>

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

于 2012-11-13T14:21:41.983 回答
3

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

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

于 2012-11-13T14:27:23.610 回答
3

例如, Aardvard 已经回答了,您看到的是任意原始值,在 C++ 标准中称为不确定值,因为输入操作失败并且input2没有分配新值。

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

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

#include <iostream>
using namespace std;

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

输出:

'a' = 97
于 2012-11-13T14:34:08.833 回答
2

因为您在 input2 处读取整数。a不是整数。input2因此什么都不会被读取,并且会保持原来的值。

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

您可以通过检查来检查读取是否成功cin.good()

于 2012-11-13T14:22:18.703 回答