字节'\ x09'终止字符串?

时间:2016-09-29 12:59:19

标签: c string echo command-line-arguments

我在程序和echo命令之间发现了意外(对我而言)。

这是我的源代码:

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]){
    printf("argv length: %d\n", strlen(argv[1]));
    return 0;
}

如果我在参数中使用字节0x09,它将终止字符串,就像我使用字节0x00一样。

示例:

user@linux:~$ ./a.out `echo -e '\x41'`
argv length: 1

user@linux:~$ ./a.out `echo -e '\x41\x41'`
argv length: 2

user@linux:~$ ./a.out `echo -e '\x41\x09'`
argv length: 1

user@linux:~$ ./a.out `echo -e '\x41\x09\x41'`
argv length: 1

有人可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

\x09是制表字符。它不会终止字符串,但是在这里你运行你的参数而不保护它们。

'\x41\x09'的情况下,标签字符只是被shell剥离了。

'\x41\x09\0x41'的情况下,tab char充当参数分隔符,从而创建另一个参数。

引用由echo消耗,但echo在回显时丢失了它,因此需要添加另一个引号。

试试:

./a.out `echo -e "'\x41\x09\x41'"`

你会看到你得到一个3字节的唯一论点

答案 1 :(得分:2)

\x09是一个标签,因此就像用以下方式提供程序一样:

./a.out A    A

第一个参数的长度为1。