无符号字符的标准输入

Posted

技术标签:

【中文标题】无符号字符的标准输入【英文标题】:Standard Input for Unsigned Character 【发布时间】:2014-08-01 19:40:50 【问题描述】:

我正在尝试通过程序发送无符号字符,并且我希望能够通过标准输入(即 std::cin)获取数字。例如,当我输入 2 时,我希望它发送☻(无符号字符 2)。当我使用代码时:

 std::cout << "Enter values: ";
            
                unsigned char d;
                unsigned char e = 2;
                std::cin >> d;
                WriteFile(file, &d, 1, &written, NULL);
                std::cout << "d= " << d << "\n"; 
                std::cout << "e= " << e;
            

我明白了

 Enter values: 2
 d=2
 e=☻

谁能告诉我为什么 d 被错误地解释为 unsigned char 50 而 e 被正确解释为 unsigned char 2?

当然,在您解释之后,您可以解释如何获取用户输入并将其转换为我发送 2 而不是“2”。

【问题讨论】:

2 是值为 2 的整数,而不是字符 '2' 这也与签名无关。 e 非常正确地具有值2,而d 确实也正确地具有值'2'。这些是完全不同的价值观。 uint8_t can't be printed with cout的可能重复 重复的唯一原因是该问题也显示出完全不了解整数和字符文字之间的区别。 【参考方案1】:

因为std::cin &gt;&gt; d;默认读取一个char类型,所以输入2翻译成字符2(ASCII码为50)而不是ASCII码2表示的字符。这是正常的行为,否则尝试从 cin 读取数字最终会变得一团糟。

另一方面,在 unsigned char e = 2; 中,您显式地为变量赋值 (2),因此编译器盲目地将其赋值给 e

你可能想要这个:

#include <iostream>
#include <string>
using namespace std;

int main(int argc, char *argv[])

    string myString;
    cin >> myString;
    char c = atoi(myString.c_str());
    cout << c << endl;

【讨论】:

好吧,我想的差不多了。那么如何在不使用 alt+2 的情况下从控制台输入中获取 ascii 值 2? @jeffpkamp 你没有。它不是可打印的字符。 @jeffpkamp 我相信标准说std::cin 是文本模式,所以我认为你不能直接阅读ascii。不过我不确定。您可以做的是将其读取为数字,然后将表示该数字的字符转换为整数。例如,可以使用char c = atoi(myString.c_str()) 将先前读取的字符串myString 转换为整数。请参阅我刚刚在上面发布的代码。【参考方案2】:

当您通过std::cin 输入2 时,它被正确解释为字符文字'2'

你应该替换

unsigned char e = 2;

unsigned char e = '2';

【讨论】:

以上是关于无符号字符的标准输入的主要内容,如果未能解决你的问题,请参考以下文章

C 库函数 - getchar()

python基本数据类型;关于字符串格式化的不出

python基本数据类型;关于字符串格式化的不出

Shell常用命令之printf

ANSI C 标准组合的类型字长和范围

无符号字符上的键盘输入?