c - 字节 '\x09' 终止字符串?

标签 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;
}

如果我在参数中使用字节 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/

相关文章:

javascript - 为什么我的 ajax 调用返回 null

javascript - 如何将 PHP 放入 Javascript 中?

c - 在以下情况下多重分配如何工作?

string - 是否可以将 Golang 字符串的内存 "safely"归零?

java - 如何检查数组是否包含字符串中的特定单词并获取它?

php - 添加 ... 如果字符串太长 PHP

javascript - echo JS选中时的Option值

c - 在 protobuf-c 中,可选的 uint32 变量可以有值 0

c - 指针数组 - 从文件读取 - 崩溃

c - `multiple definition of` 很多变量错误 - 我的 make 文件不正确吗?