"\x" 如何在字符串中工作?
Posted
技术标签:
【中文标题】"\\x" 如何在字符串中工作?【英文标题】:How does "\x" work in a String?"\x" 如何在字符串中工作? 【发布时间】:2012-04-20 21:13:44 【问题描述】:我正在编写一个 C/C++ 程序,该程序涉及将数字的十六进制表示形式放入字符串中,我对 \x
的工作原理感到困惑。我见过人们写诸如“\xb2”之类的东西的例子。在这种情况下,程序如何知道您想要 b 的十六进制后跟数字 2 还是想要 b2 的十六进制?此外,当它把它存储到内存中时,它是保存“\x”字符还是只保存十六进制表示?
【问题讨论】:
【参考方案1】:来自 C99 标准 (6.4.4.4):
每个八进制或十六进制转义序列都是最长的字符序列,可以 构成转义序列。
【讨论】:
当它存储这个序列时,它实际上存储了字符 \x 吗? 我知道这已经快 6 岁了,但是有没有办法在不向字符串写入任何内容的情况下转义该十六进制序列?假设我想要一个包含 255 'a' 'b' 'c' 的字符串。我不能写“\xffabc”,也不能写“\xff abc”,因为我要添加一个字符。 找到了!我只需要使用字符串的连接并编写 "\xff""abc"【参考方案2】:例如,字符串"123\x45"
以十六进制形式存储为31 32 33 45
。
根据 Oli 的回答,使用 '\x' 之后的最长有效值。
'\x' 未存储。任何转义序列都不会存储您在屏幕上看到的字符,它会存储指定的实际字符。例如,'\n' 实际上存储为换行符,0x0A。
【讨论】:
【参考方案3】:当您在字符串中使用转义序列 \x 时,\x 后面的数据实际上是以二进制表示形式存储的。
所以字符串“ABC”等价于字符串“\x414243”
如果您想以显示字符形式发出十六进制值,您需要使用 %x 或 %X 格式说明符:
printf("%X%X%X", 'A', 'B', 'C'); // emits "414243"
请参阅 C 库参考指南的 1.2.6 和 1.2.7 部分
希望解释有所帮助。
【讨论】:
【参考方案4】:翻译是在编译时完成的,因此您使用\x
手动输入源代码的每个字符串最终都是它在二进制文件中表示的字符。如果您想在运行时执行此操作,您将需要调用像 strtol()
这样的解析函数,使用 base 16 传递包含十六进制的字符串并将其转换为字符。
【讨论】:
以上是关于"\x" 如何在字符串中工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何使`@Endpoint(id = "health")` 在 Spring Boot 2.0 中工作?
如何让 HTML 5 输入 type="date" 在 Firefox 和/或 IE 10 中工作