无法将'#'字符作为命令行参数传递

时间:2019-11-13 13:07:18

标签: c bash command-line-arguments

我不能将以#开头的字符串作为命令行参数。

这是一个简单的测试:

#include <stdio.h>

int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; i++)
        printf("%s ", argv[i]);

    putchar('\n');

    return 0;
}

如果我输入如下参数:

2 4 # 5 6

argc的值为3,而不是6。它读取#并停在那里。我不知道为什么,在 C编程语言 C Primer Plus 的副本中也找不到答案。

3 个答案:

答案 0 :(得分:47)

#在Unix shell中开始注释,就像在C语言中的//一样。

这意味着当shell将参数传递给程序时,它将忽略#之后的所有内容。使用反斜杠或引号将其转义将意味着它被视为其他参数,并且程序应按预期运行。

2 4 \# 5 6

2 4 '#' 5 6

2 4 "#" 5 6

请注意,#仅在单词开头才是注释字符,因此这也应该起作用:

2 4#5 6

答案 1 :(得分:12)

通过命令行参数传递值时,必须遵循以下说明。 以下字符在某些情况下对外壳本身具有特殊的含义,可能需要在参数中转义:

` Backtick (U+0060 Grave Accent)
~ Tilde (U+007E)
! Exclamation mark (U+0021)
# Hash (U+0023 Number Sign)
$ Dollar sign (U+0024)
& Ampersand (U+0026)
* Asterisk (U+002A)
( Left Parenthesis (U+0028)
) Right parenthesis (U+0029)
 (⇥) Tab (U+0009)
{ Left brace (U+007B Left Curly Bracket)
[ Left square bracket (U+005B)
| Vertical bar (U+007C Vertical Line)
\ Backslash (U+005C Reverse Solidus)
; Semicolon (U+003B)
' Single quote / Apostrophe (U+0027)
" Double quote (U+0022)
↩ New line (U+000A)
< Less than (U+003C)
> Greater than (U+003E)
? Question mark (U+003F)
  Space (U+0020)1

答案 2 :(得分:8)

这是因为您使用的是类似sh的外壳。引用#或使用\对其进行转义,它将起作用。

这在sh中称为注释。它会导致#(空格哈希)及其后的所有参数都被丢弃。它与C语言中的注释类似,用于记录代码。

$开头的字符串在sh中称为变量。如果尚未设置变量,它将扩展为空字符串。

例如,所有这些都是将#传递到您的应用程序的有效方法:

2 4 '#' 5 6
2 4 "#" 5 6
2 4 \# 5 6

这些是传递以$开头的字符串的有效方法:

2 4 '$var' 5 6
2 4 '$'var 5 6
2 4 \$var 5 6

请注意,"内的变量仍在扩展。