2010-02-17 7 views
12
난 여전히 하나의 문자열 형태의 인수로 전달 될 수 어쩌면 있도록 명령 줄 인수로 널 문자로 전달하는 방법을 알고 싶습니다

:C의 명령 줄 인수에서 Null 문자를 전달하는 방법은 무엇입니까?

"\ 0be \ 0or에 \ 0 ~ \ 0 \ 0 \ 0 "

그런 다음 구문 분석하십시오. 프로그램으로이 문자열 처리 것이다 그러나 :

을 "에 \\ 0be \\ 0or \\ 0not \\ 0 ° \\ 0be \\ 0"나는이 문제를 해결할 수있는 방법

? 어떤 방법이 있습니까?

+3

이 동작은 프로그램 외부에서 발생하기 때문에 어떤 OS (및 OS에 여러 셸이있는 경우 셸)를 알면 도움이됩니다. –

+0

물론, 미안 해요. 리눅스에서 bash 쉘. – Tom

+0

다른 문자를 사용하여 '0x00'대신 인수를 분리하는 것에 대해 너무 문제가됩니까? 왜 표준 공간 ('0x20')이나 다른 문자 ('0x01')를 사용하지 않을까요? –

답변

6

C 문자열은 null로 끝나는, 그래서 당신은 단지 사용자 입력에 (\0을 변환 할 수있는 방법을 원하는 경우 NUL 문자를 포함하는 통과 문자열, 즉, ​​

이제 C. - P에 "\\0" 수 없습니다 C 문자열로)을 실제 NUL 문자로 변환하는 것은 다른 문제입니다. 이 경우 프로그램에서는 구분자로 \0을 처리하기위한 파서 만 있으면됩니다.

+0

글쎄, 그렇긴하지만 표준 라이브러리 함수를 사용할 수는 없다 ... –

+1

@Chinmay : 적어도 유닉스 ('execve'와 그 형제)와 Windows ('CreateProcess'), NUL에서 모든 다듬기 문자열. 따라서 라이브러리는 물론 OS 수준입니다. :-) –

+0

충분히 공정 :-) –

15

수 없습니다.

C 프로그램은 인수를 0으로 끝나는 문자열로 수신합니다. 이러한 문자열은 정의에 따라 null 문자를 포함 할 수 없습니다.

null 문자를 전달하려면 일부 구문으로 인코딩해야하며 C 프로그램은 해당 구문을 해석하여 해독해야합니다.

+3

'xargs -0'처럼 stdin에서 읽을 수도 있습니다. –

+2

우분투에서'./prog $ (python -c "print 'aa \ x00bb'")'를 실행하면 C 프로그램은 인수를 'aabb'로 얻습니다. 즉, 널 바이트에서 문자열을 종료하는 대신, 그것은 그것을 무시했다. 이게 너에게 의미가 있니? – gsingh2011

+0

Bash는 여전히 Python과 C 프로그램 사이에 있습니다. Bash는 파이썬 호출 (null 바이트 포함)에 의해 생성 된 바이트를 수집하고이 바이트 중 C 프로그램에 대한 인수 문자열을 작성했습니다. 분명히 Bash는 null 바이트를 특수하게 처리합니다. 대신 문자열을 자르지 않고 건너 뜁니다. –

관련 문제