2011-09-14 6 views
1

strtok 및 strcat 함께 노력하고 있지만 두 번째 printf 결코 나타나지 않습니다.Strtok 및 Strcat 충돌

int i = 0; 
char *token[128]; 
token[i] = strtok(tmp, "/"); 
printf("%s\n", token[i]); 
i++; 
while ((token[i] = strtok(NULL, "/")) != NULL) { 
    strcat(token[0], token[i]); 
    printf("%s", token[i]); 
    i++; 
} 

내 입력 후 콘솔 출력 13456. 2 개의 항상없는 것 TMP에 대한 1/2/3/4/5/6 경우 : 여기에 코드입니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까?

답변

3

두 루프는 루프의 첫 번째 반복에서 strcat 호출로 덮어 쓰기 때문에 항상 누락됩니다.

루프에 들어가면 버퍼에 "1 \ 02 \ 03/4/5/6"이 포함됩니다. 내부 strtok 포인터가 "3"을 가리 킵니다. 토큰 [1]은 "2"를 가리 킵니다.

그러면 토큰 [i] 포인터가 "\ 0"을 가리 키도록 strcat : "12 \ 0 \ 03/4/5/6"을 호출합니다. 첫 번째 인쇄물은 아무 것도 인쇄하지 않습니다.

null 문자가 입력 데이터를 덮어 쓰지 않으므로 이후의 호출은 OK입니다.

해결하려면 출력 문자열을 구문 분석중인 버퍼가 아닌 두 번째 버퍼로 작성해야합니다. (?)

작업 버전 :

#include <stdio.h> 
#include <string.h> 
int main(void) 
{ 
    int i = 0; 
    char *token[128]; 
    char tmp[128]; 
    char removed[128] = {0}; 
    strcpy(tmp, "1/2/3/4/5/6"); 
    token[i] = strtok(tmp, "/"); 
    strcat(removed, token[i]); 
    printf("%s\n", token[i]); 
    i++; 
    while ((token[i] = strtok(NULL, "/")) != NULL) { 
     strcat(removed, token[i]); 
     printf("%s", token[i]); 
     i++; 
    } 
    return (0); 
} 
0

strtok은 입력 문자열을 제자리에서 수정하고 해당 문자열에 대한 포인터를 반환합니다. 그런 다음 해당 포인터 중 하나 (token[0])를 가져 와서 해당 포인터에 쓰는 다른 작업 (strcat)으로 전달합니다. 쓰기가 서로 쇄도하고 있습니다.

모든 토큰을 연결하려면 char*strcpy에 할당해야합니다.