[c] ‘#’문자를 명령 줄 인수로 전달할 수 없습니다

#명령 줄 인수로 시작하는 문자열을 전달할 수 없습니다 .

간단한 테스트는 다음과 같습니다.

#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 사본에서 답을 찾을 수 없습니다 .



답변

# 유닉스 쉘에서 주석을 시작합니다. //C에서 .

즉, 쉘이 인수를 프로그램에 전달하면 # 뒤에 나오는 모든 것을 무시합니다. 백 슬래시 또는 따옴표로 이스케이프 처리하면 다른 매개 변수와 같이 취급되며 프로그램이 예상대로 작동해야합니다.

2 4 \# 5 6

또는

2 4 '#' 5 6

또는

2 4 "#" 5 6

참고는 그 #유일한 단어의 시작에 주석 문자입니다 이것은 또한 작동합니다 그래서 :

2 4#5 6


답변

명령 행 인수를 통해 값을 전달할 때 다음 지시 사항을 따라야합니다. 다음 문자는 일부 상황에서 쉘 자체에 특별한 의미를 가지며 인수에서 이스케이프해야 할 수도 있습니다.

` 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


답변

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

의 내부 변수 "는 여전히 확장되어 있습니다.


답변