【问题标题】:Byte '\x09' terminates the string?字节 '\x09' 终止字符串?
【发布时间】: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&lt;argc; a++) printf("argv length: %d\n", strlen(argv[a]));,然后尝试输入'\x41\x09\x42',预计会看到2行输出,每行长度为1。现在尝试'\x41\x0\x42'。你认为会发生什么?

标签: c string echo command-line-arguments


【解决方案1】:

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

'\x41\x09' 的情况下,制表符只是被外壳剥离。

'\x41\x09\0x41' 的情况下,制表符充当参数分隔符,从而创建另一个参数。

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

试试看:

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

你会看到你得到一个 3 字节的唯一参数

【讨论】:

  • 只是添加一些内容:您的最后一个命令无法按预期工作,因为 " 被视为参数的“一部分”(如制表符)。那个有效:./a.out "`echo -e '\x41\x09\x41'`"。也许你应该编辑你的答案。谢谢!
  • @J.Doe 很奇怪,因为 echo -e "'\x41\x09\x41'" 与引用的 'A A' 相呼应。今晚我会检查一下(为了答案的完整性)。
【解决方案2】:

\x09 是一个标签,所以它就像给你的程序喂食:

./a.out A    A

第一个参数的长度是1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 2016-03-22
    • 1970-01-01
    • 2011-06-04
    • 2013-02-21
    • 1970-01-01
    • 2012-12-23
    相关资源
    最近更新 更多