我仍然想知道如何在命令行参数中传递空字符,这样可以将单个字符串以如下形式作为参数传递:
"to\0be\0or\0not\0to\0be\0"
然后再解析它。 但是程序会将此字符串视为:
"to\\0be\\0or\\0not\\0to\\0be\\0"
有没有办法解决这个问题?
我仍然想知道如何在命令行参数中传递空字符,这样可以将单个字符串以如下形式作为参数传递:
"to\0be\0or\0not\0to\0be\0"
然后再解析它。 但是程序会将此字符串视为:
"to\\0be\\0or\\0not\\0to\\0be\\0"
有没有办法解决这个问题?
不可能。
C程序将参数作为以零结尾的字符串接收。根据定义,这样的字符串不能包含空字符。
如果您想传递空字符,则必须使用一些语法对其进行编码,然后您的C程序必须通过解释该语法来解码它。
./prog $(python -c "print 'aa\x00bb'")
ж—¶пәЊCзЁ‹еғЏе°†еЏ‚ж•°дҢњдёғaabb
иҺ·еЏ–пәЊиү™ж„Џе‘ізқЂе®ѓеүҢз•Өдғ†ењЁз©ғе—节处终жұе—符串。дҢ 觉ең—иү™жњ‰д»»дҢ•ж„Џд№‰еђ—пәџ - gsgxbash: warning: command substitution: ignored null byte in input
。 - Mathieu CAROFFecho $(python3 -c "print('aa\x00bb')")
时,你会得到aa bb
(带有空格字符0x20)。而在bash中,你会得到aabb
,没有空格。 - alifeC字符串以空字符结尾,因此在C中无法传递包含NUL字符的字符串。:-P
现在,如果您只是想找到一种将用户输入中的\0
(即"\\0"
作为C字符串)转换为实际NUL字符的方法,那就另当别论。在这种情况下,您的程序只需要一个解析器来将\0
视为分隔符。
execve
及其兄弟)和Windows(CreateProcess
)中,都会在NUL处截断字符串。因此,这是在操作系统级别上进行的,而不仅仅是库。 :-) - C. K. Young
0x00
有什么问题吗?为什么不使用标准空格 (0x20
) 或其他字符 (甚至是0x01
) 呢? - Chinmay Kanchi