2016-09-29 95 views
1

我在我的程序和echo命令之间发现了一个意外的(对我来说)行为。Byte' x09'终止字符串?

这里是我的源代码:

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

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

如果我在参数中使用的字节0x09,它将终止字符串,因为如果我使用的字节0x00

例子:

[email protected]:~$ ./a.out `echo -e '\x41'` 
argv length: 1 

[email protected]:~$ ./a.out `echo -e '\x41\x41'` 
argv length: 2 

[email protected]:~$ ./a.out `echo -e '\x41\x09'` 
argv length: 1 

[email protected]:~$ ./a.out `echo -e '\x41\x09\x41'` 
argv length: 1 

有人能解释为什么会发生这种情况?

+2

增强你的程序和printf所有的参数,而不是只有第一个,你就会明白。 –

+1

'argv'被空白分隔;我猜''x09'是空格...... – Evert

+1

0x09(TAB)被shell视为一个空白字符。它与C语言无关。 –

回答

3

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

'\x41\x09'的情况下,tab字符被shell剥离。

'\x41\x09\0x41'的情况下,tab字符串作为参数分隔符,从而创建另一个参数。

报价被echo消耗,但echo在回显时丢失,因此需要添加另一个报价。

试一下:

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

你会看到你会得到一个3字节的唯一的参数

+0

只是添加一些东西:你的最后一个命令不能按预期工作,因为'''被认为是参数的'部分'(就像标签字符)那样工作:'./a.out“\'echo -e'\ x41 \ x09 \ x41'\'“'。也许你应该编辑你的答案。谢谢! –

+0

@ J.Doe奇怪的是'echo -e''\ x41 \ x09 \ x41' 'A',我今晚会检查一下(答案的完整性)。 –

2

\x09是一个标签,所以它就像喂养你的程序:

./a.out A A 

且第一个参数的长度为1