繁体   English   中英

如何从控制台为 getc 输入十六进制值

[英]How to make a Hexadecimal value input from the console for getc

我们知道,如果我们在 ac 源文件中编写一个像“\\x61\\x61”这样的字符串,它实际上意味着“aa”。 当从控制台为 getc 或 fgetc 函数输入字符时,我们是否只给出了一些十六进制值? 也许像'\\x61'而不是'a'。

简短的总结是没有。 但你可能想要的远不止这些。

假设您的环境正在使用一些 ASCII 超集(虽然语言不需要,但对于本世纪的任何机器和操作系统来说,这是一个非常合理的假设), "\\x61\\x61""aa" 转换是在编译时完成的——如果你检查编译器的输出(例如,通过阅读它发出的汇编代码),你会在那里找到aa ,而不是\\x61\\x61 允许使用这种语法是为了让人们在代码文件中写入原本无效的字符(最流行的示例是代码点零,写入\\x00\\000并且基本上总是缩写为\\0 (只要它后面没有跟0-7 范围内的数字))。
这里的关键是你的程序没有看到\\x61\\x61 ,而是aa 您无法恢复源表示——就像您无法区分240300x18

另一方面, getc和朋友读取原始文本输入。 除了换行符转换之外,它们不做任何处理。 如果要进行处理,则必须在自己的代码中进行 此类处理还必须处理无效序列(例如\\xyz )并调整大小并四处移动字符串(因为\\x61是四个字符而a是一个字符),这些问题并不像最初看起来那么明显一瞥。 将这种负担强加给需要这种特定处理的奇数应用程序的所有应用程序是不正确的。

如果您知道要读取十六进制转义序列(而不是直字符),那么您可以使用scanf读取十六进制输入:

unsigned char next;
int rv = scanf("\\x%2hhx", &next);
// now rv is true if a character was read, and next contains the character

但是,这种方法不适用于混入转义序列的字符串,例如x\\x79z 对于这些字符串,您必须编写一个实际的字符串处理器来转换它们——就像编译器对您的代码所做的那样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM