2010-02-17 37 views
12

我还是想知道如何在一个空字符传递作为命令行参数,也许让一个字符串可以作为形式参数传递的:如何在C中的命令行参数传入空字符?

“到\ 0BE \ 0or \ 0not \ 0to \ 0be \ 0“

然后解析它。 然而该计划将处理这个字符串:

“到\\ \\ 0BE \\ 0or \\ 0not \\ 0℃至\\ 0BE 0”

我如何解决此问题?有什么办法吗?

+3

这将有助于知道您的目标是哪个操作系统(和shell,如果您的操作系统具有多个shell),因为此行为将在您的程序外部。 – 2010-02-17 18:25:36

+0

当然,对不起。 Linux下的bash shell。 – Tom 2010-02-17 18:41:11

+0

使用另一个字符来分隔参数而不是'0x00'有什么问题?为什么不使用标准空间('0x20')或其他字符(可能甚至是'0x01')? – 2010-02-17 19:46:23

回答

6

C字符串是空终止,因此包含NULL字符字符串传递是不可能的C. :-P现在

,如果你只是想办法转换\0(在用户输入,即"\\0"作为C字符串)转换为实际的NUL字符,这是另一回事。在这种情况下,你的程序只需要一个解析器就可以将\0作为分隔符。

+0

这是,但你不能使用任何标准库函数...... – 2010-02-17 18:32:37

+1

@Chinmay:通常的程序执行系统调用,至少在Unix('execve'和它的兄弟姐妹)和Windows('CreateProcess' ),所有修剪线在NUL处关闭。所以,这是在操作系统层面,而不仅仅是图书馆。 :-) – 2010-02-17 18:34:21

+0

不够公平:-) – 2010-02-17 19:43:57

15

你不行。

C程序接收参数为零终止的字符串。根据定义,这样的字符串不能包含空字符。

如果你想传递一个空字符,那么你必须用某种语法对它进行某种编码,然后你的C程序必须通过解释该语法来解码它。

+3

你也可以从标准输入中读取它,就像'xargs -0'一样。 – 2010-02-17 18:34:49

+2

当我在Ubuntu的Bash中执行'./prog $(python -c“print'aa \ x00bb'”)'时,C程序将参数作为'aabb'获取,意思是不是在空字节处终止字符串,它忽略了它。这对你有意义吗? – gsingh2011 2013-11-13 03:34:27

+0

Bash仍然驻留在Python和C程序之间; Bash收集了由Python调用产生的字节(包括空字节),并为这些字节中的C程序构建了一个参数字符串。显然Bash特别处理空字节,通过跳过它们而不是让它们截断字符串。 – 2013-11-13 11:35:18