如何在C语言的命令行参数中传递空字符?

19

我仍然想知道如何在命令行参数中传递空字符,这样可以将单个字符串以如下形式作为参数传递:

"to\0be\0or\0not\0to\0be\0"

然后再解析它。 但是程序会将此字符串视为:

"to\\0be\\0or\\0not\\0to\\0be\\0"

有没有办法解决这个问题?


3
请告诉我您要翻译的操作系统(如果您的操作系统有多个 shell,也请告诉我所针对的 shell),因为这种行为与您的程序无关。我需要了解这些信息才能为您提供更好的帮助。 - Tyler McHenry
当然,抱歉。 在Linux下的bash shell。 - Tom
使用其他字符来分隔参数,而不是使用 0x00 有什么问题吗?为什么不使用标准空格 (0x20) 或其他字符 (甚至是 0x01) 呢? - Chinmay Kanchi
2个回答

22

不可能。

C程序将参数作为以零结尾的字符串接收。根据定义,这样的字符串不能包含空字符。

如果您想传递空字符,则必须使用一些语法对其进行编码,然后您的C程序必须通过解释该语法来解码它。


2
еҢ“我在Ubuntuзљ„Bash中执иҰЊ./prog $(python -c "print 'aa\x00bb'")ж—¶пәЊCзЁ‹еғЏе°†еЏ‚ж•°дҢњдёғaabbиҺ·еЏ–пәЊиү™ж„Џе‘ізқЂе®ѓеүҢз•Өдғ†ењЁз©ғ字节处终ж­ұ字符串。дҢ и§‰ең—иү™жњ‰д»»дҢ•ж„Џд№‰еђ—пәџ - gsgx
1
Bash仍然位于Python和C程序之间;Bash收集了Python调用产生的字节(包括空字节),并根据这些字节为C程序构建了一个参数字符串。显然,Bash特别处理空字节,通过跳过它们而不是让它们截断字符串。 - Thomas Pornin
$ echo $(python -c "print 'aa\x00bb'") 会向 bash tty 发出警告:bash: warning: command substitution: ignored null byte in input - Mathieu CAROFF
当zsh执行echo $(python3 -c "print('aa\x00bb')")时,你会得到aa bb(带有空格字符0x20)。而在bash中,你会得到aabb,没有空格。 - alife

6

C字符串以空字符结尾,因此在C中无法传递包含NUL字符的字符串。:-P

现在,如果您只是想找到一种将用户输入中的\0(即"\\0"作为C字符串)转换为实际NUL字符的方法,那就另当别论。在这种情况下,您的程序只需要一个解析器来将\0视为分隔符。


2
@Chinmay:通常的程序执行系统调用,至少在Unix(execve及其兄弟)和Windows(CreateProcess)中,都会在NUL处截断字符串。因此,这是在操作系统级别上进行的,而不仅仅是库。 :-) - C. K. Young

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