我在我的程序和 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
是列表字符。它不会终止一个字符串,但在这里您运行了您的参数而不保护它们。
在 '\x41\x09'
的情况下,制表符只是被 shell 剥离了。
在 '\x41\x09\0x41'
情况下,制表符用作参数分隔符,从而创建另一个参数。
引号被 echo
消耗了,但是 echo
在回显时丢失了它,因此需要添加另一个引号。
试试看:
./a.out `echo -e "'\x41\x09\x41'"`
你会看到你得到一个 3 字节的唯一参数
关于c - 字节 '\x09' 终止字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39771042/