我发现我的程序和echo命令之间有一种出乎意料的行为。
这是我的源代码:

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

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

如果我在参数中使用byte0x09,它将终止字符串,就像我使用byte0x00
示例:
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是制表字符它不终止字符串,但在这里您运行参数时没有保护它们。
'\x41\x09'情况下,tab char被shell剥离。
'\x41\x09\0x41'情况下,tab char充当参数分隔符,从而创建另一个参数。
引用被echo消耗,但是当回传时echo丢失,因此需要添加另一个引用。
试试看:

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

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

关于c - 字节'\x09'终止字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39771042/

10-11 15:16