2016-09-29 129 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