字节 '\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 字节的唯一参数
我在我的程序和 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 字节的唯一参数