2011-11-26 5 views
1

C에서 strtok을 사용하는 데 문제가 있습니다. fgets를 사용하여 명령 줄에서 사용자 입력을 얻었으므로 파이프 ("|")를 delimeter로 토큰 화하고 결과를 a 이중 포인터 변수. 그것은 잘 C 언어에서 strtok 사용

while(*argv!= NULL) 
{ 
    if((strcmp(*argv, "|") == 0){ 
    count = count + 1; 
    } 
    argv++; 
} 
printf("%d pipes", count); 

을 토큰 화 된 것 그러나 그것이 작동하지 않는 경우

char** argv; 
char *token; 
token = strtok(userInput, "|"); 
while(token != NULL){ 
    *(argv++) = token; 
    token = strtok(NULL, "|"); 
} 

*argv = '\0'; 

내가 다음 확인하려면이 코드를 사용 : 여기에 내 코드입니다. char ** argv는 아무것도 포함하지 않습니다. 코드 실행이 중지되고 -1이 반환됩니다. argv를 인쇄하려고하면 argv에 값이 없습니다.

어떤 아이디어로주세요? 감사.

편집 :

내가 뭘 원하는 strtok를 사용 후이

userInput = "abc|cde"; 

입니다. 나는

**argv = "abc"; 
+0

는하지만 그것은 작동하지 않습니다 * * 무엇 정확히 발생합니다.? – Dennis

+0

작동하지 않는다고 말할 때 어떤 오류가 발생합니까? –

+0

"작동하지 않는다"는 것은 무엇을 의미합니까? 코드는 당신이 말한 것과 정확하게 일치합니다. 그것은 예상 한 것과 다를 수 있습니다. 그러나 우리에게 말할 의향이 없다고 추측하는 것은 불가능합니다. –

답변

0

귀하의 토큰 화 코드는 다음과 같이 작동하는 ** argv를 갖고 싶어 : 당신이 기대 될 수 다음

userInput = "a|b|c" 

argv = { "a", "b", "c" } 

경우를 그

argv = {"a","|","b","|","c"} 

상담 코드 t 파이프해야한다 :

while(*argv != NULL) 
{ 
    count = count + 1; 
    argv++; 
} 
printf("%d pipes", count-1); 

나는 그것이

+0

내가 원하는 것에 거의 가깝습니다. 사실 내가 원하는 것은 :'{a b | ''NULL '}''char ** argv = { "a", "b", NULL}' – mkab

+0

내 편집 된 질문을 확인하십시오 – mkab

+0

처음으로'| ' 구분 기호. ?? – anshul410

2

하나의 문제는 argv을 초기화 할 것 같지 않는 것이 작동합니다 생각합니다. 필요에 따라 char *을 유지하기 위해 충분한 메모리를 할당해야합니다. 그렇지 않으면 당신은 임의의 메모리 블록에 글을 쓰고 있습니다. (단지 관련 코드를 표시하지 않았습니까?)

또 다른 문제는 실제로 argv을 수정하고 있다는 것입니다. 따라서 해당 루프의 마지막 부분에서 마지막 토큰을 지나서 가리키고 있습니다. *argvNULL으로 설정하십시오.); 인증 코드는 첫 번째 토큰을 가리키는 것으로 가정하고 *argv이 아닌 것으로 확인하여 시작합니다.NULL이 아닙니다. (단지 당신이 우리에게 어떤 관련 코드를 보여주지 않았습니까?) 덧붙여 편집 : 위의 당신의 의견에서 "argv는 값을 가지고 있지 않습니다"라는 것을 볼 수 있습니다. 나는 꽤 자신감이 이유입니다.

덧붙여 말하자면, '\0' (null 바이트)과 NULL (null 포인터)을 혼동하는 것입니다. 기술적으로 이것은 올바르게 작동합니다. — '\0'0으로 승격되며 0NULL —으로 변환되지만 개념적으로 상당히 다르므로 다소 혼란 스럽습니다. 더 명확한 설명이 필요하면 *argv = '\0'이 아닌 *argv = NULL으로 작성해야합니다.

+0

수정 된 질문 확인하기 – mkab

0

300x400을 검색 할 때 사용하는 형식입니다. "x"를 찾아 x를 없애고 양면 인 300과 400을 사용하십시오. 이것은 나를 위해 작동합니다.

char *tok1, *tok2, *saveptr; 

tok1 = strtok_r(argv, "x", &saveptr); 
tok2 = strtok_r(NULL, "x", &saveptr); 

printf("this tok1 %s this is tok2 %s\n", tok1, tok2); 

strtok_r 기능을 사용하여

0

문제가 당신이 그것을 결과 얻으려고 할 때 변수는 argv가 첫 번째 요소를 가리 키지 않습니다이다.

문제는 여기서 발생합니다 토큰 * (변수는 argv ++) =

ARGV 당신이 (당신이 제대로 초기화했다고 가정) 배열을 argv를 위해 토큰 포인터를 추가 할 때 증가 (*이는 char에 대한 포인터를). 따라서 코드의 두 번째 부분을 사용하여 결과를 얻으면 argv는 이미 '\ 0'의 마지막 요소를 가리키고 출력을 생성하지 않습니다.

그리고 양쪽 모두 문법적으로 맞지만 '\ 0'을 (를) 섞어 쓰고 있지만 포인터를 의미하기 때문에 NULL을 사용하는 것이 더 낫습니다. '\ 0'은 (는) NULL 종료를 의미합니다. C 문자열

는 다음에 코드를 변경할 수 있습니다

/* Init argv array */ 
char** argv; 
size_t argc=0; // token count 
char *token; 
token = strtok(userInput, "|"); 
while(token != NULL){ 
    argv[argc++] = token; 
    token = strtok(NULL, "|"); 
} 
argv[argc] = NULL; // the last element of argv array is a NULL pointer 

/* get result from argv */ 

while(*argv!= NULL) 
{ 
    if((strcmp(*argv, "|") == 0){ 
    count = count + 1; 
    } 
    argv++; 
} 
printf("%d pipes", count);