【发布时间】:2016-09-29 22:06:07
【问题描述】:
我在我的程序和 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
有人能解释一下为什么会这样吗?
【问题讨论】:
-
增强您的程序并打印所有参数,而不仅仅是第一个参数,您就会明白。
-
argv被空格分割;我猜\x09是空格... -
0x09 (TAB) 被 shell 视为一个空白字符。与C语言无关。
-
./a.out '\x41\x09\x41'给了什么? -
使用
int a; for (a=1; a<argc; a++) printf("argv length: %d\n", strlen(argv[a]));,然后尝试输入'\x41\x09\x42',预计会看到2行输出,每行长度为1。现在尝试'\x41\x0\x42'。你认为会发生什么?
标签: c string echo command-line-arguments