我不能将以#
开头的字符串作为命令行参数。
这是一个简单的测试:
#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 的副本中也找不到答案。
答案 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
请注意,"
内的变量仍在扩展。