如何在C语言中转义或终止转义序列

12
我有一些需要传递给解码函数的字符序列:
例如:
"\x05three"

(是的,这是带有长度前缀的Pascal风格字符串。该函数将长度前缀字符串转换为以null结尾的字符串。)

我写了几个测试用例,其中包括:

"\x04four"

令我惊讶的是,这变成了"Oour"。仔细一看,原来在Visual Studio的转义序列规范中允许这样做,我的序列基本上被解释为\x04f,它在十进制中是79(因此我的结果字符串变成了"Oour",79对应'O')。

我的解决方法很简单,就是拆分这个字符串:

"\x04" "four"

问题:还有其他方法可以转义或终止转义序列吗?


1
0x04f 是 4*16+15 = 79,所以是 'O'。 - Daniel Fischer
1
0x4f(十六进制)是79(十进制),表示字母“O”。80(十进制)代表字母“P”,不是0x80(十六进制)。0x80表示128(十进制),不是标准 ASCII 字符。 - Joseph Stine
谢谢你们两位。我现在感到有点羞愧。我想知道今天早上是否拿错了无咖啡因咖啡罐... - MPelletier
那里你可以看到即使有一个无咖啡因罐的危险。 - Daniel Fischer
2个回答

4

是的,你可以尝试 "\004four" 例如。实际上,甚至 "\04four" 也可能行得通,因为 f 不是八进制数字。


@AndersK。很可能。对我来说,这是一个非常明显的事情! - MPelletier
@MichaelKrelin-hacker 天哪,真的,应该是八进制。也许只是 Visual Studio 在捉弄我,但它肯定在做些什么。 - MPelletier
我记得在使用八进制时,反斜杠后面的三个数字是最远可以到达的。但自从我学习了PDP-11的C语言文字时,我们使用八进制,我从未费心去研究它在十六进制下的行为。因为如果两个十六进制数字也能终止转义序列,那将是完全合理的。也许,它也是三个。 - Michael Krelin - hacker
现在你知道的比我多了。好吧,不再是这样了;-) - Michael Krelin - hacker
1
@romor,是的,没错,十六进制的行为不同,显然是因为八进制先出现了,在八进制中一个字节不超过三个字符,255表示为377。在十六进制中,你仍然可以使用\x{4}7-zip,实际上在八进制中也是一样的,使用\o{4}7-zip,但这可能需要一个现代编译器。 - Michael Krelin - hacker
显示剩余8条评论

0

您只需将字符串放在一起编写:

char a[3] = "1\02"   // {'1', '\2', '\0'}  
char a[4] = "1\0""2" // {'1', '\0',  '2', '\0'}

sizeof("1\02") // 3
sizeof("1\0""2") // 4

你只需要将字符串并排写在一起,就像MPelletier在问题中所述的那样:“我的解决方案很简单,就是将字符串分割为:”\x04“”four“”。 - greybeard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接