2015-01-30 2 views
0

간단한 쉘을 작성하고 있습니다. 나는 명령 행을 토큰 화하여 파서를 execvp으로 보내도록 썼다. 파싱하는 동안 문자 &을 확인하고 \0으로 바꾸고 싶습니다. 나는 포인터로 작업 중이며 진행 방법에 약간 혼란 스럽다. 여기 내 파서 코드는 다음과 같습니다.C에서 포인터를 사용하여 명령 줄 구문 분석 및 문자 바꾸기

나는 포인터를 사용하고 있기 때문에, 나는 원하는 것을 대체하는 데 어려움을 겪고 있습니다. 위의 배열에 해당하는 배열을 사용해야합니까, 아니면 쉬운 수정이 있습니까? 기본적으로, 을 &으로 읽은 경우 으로 바꾸려면 코드를 1으로 바꾸고 싶습니다. 포인터를 사용하는 문자 만 바꾸는 방법이 있습니까?

+0

그냥'strtok' 이상'strtok_r'을 사용하십시오 : -

편집 즉시 *args = NULL 전에 그런 짓을, 오른쪽 끝에서 &을 확인합니다. 오류가 발생하기 쉽습니다. – abligh

+0

@abligh 당신은 매우 옳습니다.하지만 'strtok_r()'은 표준 C가 아니며 대부분 컴파일러 확장입니다. –

+0

@SouravGhosh가 잘못되었습니다. 이것은 POSIX 함수입니다 : http://pubs.opengroup.org/onlinepubs/9699919799/functions/strtok_r.html – abligh

답변

0

내 의견을 다시 말하지만 strtok은 파서에서 잘못된 시도가 아닙니다. **args의 끝을 오버런하지 않았는지 확인합니다.

문제의 일부는 잘 정의되어 있지 않습니다. 마지막 인수의 마지막 문자가 &인지 확인하고 싶습니까? (그렇다면 인수 처리가 끝나면 수정하십시오). 또는 종료 구분자로 &을 집계하고 그 전에 모든 것을 하나의 명령으로 계산하고 그 이후의 모든 것을 다른 것으로 간주 하시겠습니까? 이 경우 가장 좋은 방법은 &\0, ,, parseArgs으로 바꿔 문자열을 사전 처리하는 것입니다. 쉘을 실행하고 완료하면 어디서 왔는지 확인하십시오 (따라서 foo & bar & baz 작동) . 그러나 실제 셸에서는 2>&1 같은 것을 I/O 리디렉션으로 처리 할 수 ​​있습니다. 그런 일을하기 위해서 아마도 토큰 화하는 것이 가장 좋을 것입니다. 그렇게하기 위해 yacc/lex는 친구입니다.

int lenlast = strlen (*args); 
if ((*args)[lenlast] = '&') 
{ 
    (*args)[lenlast] = '\0'; 
    background = 1; /* declare that somewhere */ 
} 
+0

'&'가 마지막 문자인지 확인하고 싶습니다. 나는'foo & bar & baz' 사건을 다루지 않을 것입니다. 인수 처리가 끝날 때이를 어떻게 확인합니까? – iHubble

+0

@iHubble : 편집 참조 – abligh

관련 문제