我发现我的程序和echo
命令之间有一种出乎意料的行为。
这是我的源代码:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]){
printf("argv length: %d\n", strlen(argv[1]));
return 0;
}
如果我在参数中使用byte
0x09
,它将终止字符串,就像我使用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/