为什么字符'a'没有自动转换为 97?
Why is character 'a' not converted to 97 automatically?
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 十二月。 为什么它打印 -858993460? "a"不会自动转换为 97?为什么?
a
作为字符串,不能按照以下规则转换为int
std::cin
。请考虑一下:a
不是以 10 为基数的有效整数。std::cin
将无法将字符串"a"
转换为int
。
它打印-858993460
的原因是因为int
没有初始化,所以它可以打印任何东西,或者什么都不打印,或者做任何它想做的事情(查找未定义的行为)。
请尝试以下操作:
char input2_chr;
std::cin >> input2_chr;
int input2 = input2_chr;
我认为输入只是失败了,你看到的值是未定义行为的结果(input2
从未被写入)。
如果尝试读取整数,则字符"a"无效,因此>>
运算符不会接受该字符。
您似乎以某种方式期望输入应将字符转换为该字符的 ASCII 代码,以便为您提供请求的整数类型结果。该语言不支持此推理。
在第一个中,你要求输入一个字符,所以你得到了第一个 流中的非空格字符。 在第二个中,你要求 输入一个整数,以便流跳过空格(就像它总是这样做一样>>
),并尝试解析整数。 由于"a"
不能是 整数值的开始,流设置错误状态(failbit
) 并返回,不修改input2
。 输出时 未初始化的变量,您具有未定义的行为。 (你应该切勿使用您输入的变量,除非首先检查 输入成功与否。
从您的描述来看,听起来您正在尝试输入一些 二进制格式。 为此,您必须以二进制模式打开流, 确保它充满了"C"
区域设置,然后使用istream::get
或istream::read
. (当然,你必须知道什么 二进制格式是您正在阅读,以便能够 将您读取的未格式化字节转换为您实际的信息 需要。
例如,Aardvard 已经回答过,您会看到一个任意的原始值,在C++标准中称为不确定值,因为输入操作失败并且input2
没有被分配新值。
要输出char
变量值的十进制表示形式,只需将其转换为int
即可将输出流定向为整数。
将其转换为int
的最简单方法是通过在表达式中使用变量来鼓励隐式提升,例如只需在其前面添加一个+
符号:
#include <iostream>
using namespace std;
int main()
{
char const ch = 'a';
cout << "'" << ch << "' = " << +ch << endl;
}
输出:
"a" = 97
因为你正在读取一个整数 input2.a
不是整数。因此,不会读取任何内容,并且将保留input2
的原始值。
在这种情况下,它将是某个随机值,因为input2
未初始化。
您可以通过检查cin.good()
来检查读取是否成功
- HEX值到wchar_t字符(UTF-8)的转换
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 转换特殊字符(UTF-8)
- 将转换字符键入 int 以用作向量C++的索引
- 将字符随机转换为大写的函数
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 转换字符时Arduino DUE 和 Arduino UNO 之间的区别
- 如何在C++中正确重载运算符转换字符*?
- 如何转换数据结构以在 c++ 中转换字符*
- 不兼容的转换字符
- 将转换字符数组[16]键入为int 128位
- 在c++中转换字符编码
- 使用递归转换字符
- 如何在Objective-C/C/C++中转换字符和字节的位置
- C++到Pep/8汇编语言的转换——字符数组
- 转换字符>十六进制