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

Byte '\x09' terminates the string?

我在我的程序和 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

谁能解释为什么会这样?

\x09 是一个选项卡,所以它就像为您的程序提供:

./a.out A    A

第一个参数的长度为1

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

'\x41\x09' 的情况下,制表符刚刚被 shell 剥离。

'\x41\x09[=13=]x41' 的情况下,制表符充当参数分隔符,从而创建另一个参数。

引用被 echo 使用,但 echo 在回显时丢失了它,因此需要添加另一个引用。

试试看:

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

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