web-dev-qa-db-ja.com

'#'文字をコマンドライン引数として渡すことができません

#で始まる文字列をコマンドライン引数として渡すことができません。

ここに簡単なテストがあります:

#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プライマープラスのコピーにも答えがありません。

36
cd-00

#は、Cの//と同様に、UNIXシェルでコメントを開始します。

これは、シェルがプログラムに引数を渡すときに、#以降のすべてを無視することを意味します。バックスラッシュまたは引用符でエスケープすると、他のパラメータと同様に扱われ、プログラムは期待どおりに動作するはずです。

2 4 \# 5 6

または

2 4 '#' 5 6

または

2 4 "#" 5 6

#はWordの先頭にあるコメント文字なので、これも機能することに注意してください。

2 4#5 6
47
fanduin

コマンドライン引数を介して値を渡す場合は、次の手順を実行する必要があります。次の文字は、一部のコンテキストではシェル自体に特別な意味があり、引数でエスケープする必要がある場合があります。

` 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
12
VJAYSLN

shのようなシェルを使用しているためです。 #を引用するか、\を使用してエスケープすると機能します。

これは、shではコメントと呼ばれます。 #(スペースハッシュ)とその後の引数は破棄されます。これはCのコメントと同様に使用され、コードの文書化に使用されます。

$で始まる文字列は、shvariablesと呼ばれます。変数を設定していない場合は、空の文字列に展開されます。

たとえば、これらすべてが#をアプリケーションに渡す有効な方法です。

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

"s内の変数は引き続き展開されることに注意してください。

8
S.S. Anne