C 字节'\x09&x27;终止字符串?

C 字节'\x09&x27;终止字符串?,c,string,echo,command-line-arguments,C,String,Echo,Command Line Arguments,我发现我的程序和echo命令之间有一个(对我来说)意外的行为 以下是我的源代码: #include <stdio.h> #include <string.h> int main(int argc, char* argv[]){ printf("argv length: %d\n", strlen(argv[1])); return 0; } 有人能解释一下为什么会发生这种情况吗?\x09是一个选项卡,所以它就像给程序提供了: ./a.out A

我发现我的程序和
echo
命令之间有一个(对我来说)意外的行为

以下是我的源代码:

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

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

有人能解释一下为什么会发生这种情况吗?

\x09
是一个选项卡,所以它就像给程序提供了:

./a.out A    A

第一个参数的长度是1。

\x09
是一个选项卡,因此它就像在程序中输入:

./a.out A    A

第一个参数的长度是1。

\x09
是制表字符。它不会终止字符串,但在这里,您运行的参数没有保护它们

'\x41\x09'
案例中,tab字符被shell剥离

'\x41\x09\0x41'
案例中,tab字符充当参数分隔符,从而创建另一个参数

引用被
echo
使用,但是
echo
在回显时丢失,因此需要添加另一个引用

试试看:

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

您将看到一个3字节的唯一参数

\x09
是制表字符。它不会终止字符串,但在这里,您运行的参数没有保护它们

'\x41\x09'
案例中,tab字符被shell剥离

'\x41\x09\0x41'
案例中,tab字符充当参数分隔符,从而创建另一个参数

引用被
echo
使用,但是
echo
在回显时丢失,因此需要添加另一个引用

试试看:

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

您将看到一个3字节的唯一参数

增强您的程序并打印所有参数,而不仅仅是第一个参数,您将理解。
argv
由空格分割;我猜
\x09
是空白…外壳程序将0x09(制表符)视为空白字符。它与C语言无关。
/a.out'\x41\x09\x41'
给出了什么?使用
inta;对于(a=1;a增强您的程序并打印所有参数,而不仅仅是第一个参数,您会理解。
argv
被空格分割;我猜
\x09
是空格…0x09(制表符)shell将其视为一个空白字符。它与C语言无关。而
/a.out'\x41\x09\x41'
给出了什么?使用
int a;for(a=1;a必须添加一些内容:上一个命令无法按预期工作,因为
被视为参数的“部分”(如制表符)。那一个成功了:
/a.out“`echo-e'\x41\x09\x41'`
。也许你应该编辑你的答案。谢谢!@J.Doe奇怪,因为
echo-e''\x41\x09\x41'
回显了一个引用的
'a'
。我今晚会检查一下(为了答案的完整性)。只是想补充一点:您的上一个命令没有按预期工作,因为
被视为参数的“一部分”(如制表符)。该命令工作:
/a.out“`echo-e'\x41\x09\x41'``
。也许您应该编辑您的答案。谢谢!@J.Doe奇怪的是
echo-e'\x41\x09\x41''
回显一个引用的
'a'
。我今晚会检查一下(以确保答案的完整性)。