2013-03-30 2 views
0

이 프로그램에서 char * 토큰은 이상한 쓰레기 값으로 초기화됩니다. 정렬 할 수 없습니다. 여기에 소스 코드는 다음과 같습니다Strtok : 왜이 ​​프로그램이 계속 실패하는지 알지 못합니다.

#include<iostream> 
#include<string.h> 
#include<stdlib.h> 

void fetch_value(char *string,int pos,char *dest) 
{ 
    char *token; 
    int i=0; 
    token=strtok(string,","); 
    if(pos>1) 
    { 
        token=strtok(NULL,","); 
        while(i<pos-1){ 
            token=strtok(NULL,","); 
            printf("token =%s\n",token); 
            i++; 
        } 
        strcpy(dest,token); 
    } 
    else 
    { 
        strcpy(dest,token); 
    } 
} 

int main(void) 
{ 
    char checking[100]; 
    memset(checking,0x00,sizeof(checking)); 
    fetch_value("14174000100,35679700322,35679700322,35679700322, 
            35679700322,14174000999,919440710210000,1",0,checking); 
    printf("checking=%s\n",checking); 
    return 0; 
} 

도움, 의견이나 제안이 크게 감사합니다.

+2

을 당신은 "C"로이 태그. '3 '여기에 무엇입니까? 그건 C++이고 불필요한 것입니다. – Jens

답변

3

strtok의 첫 번째 인수는 수정 가능해야합니다. 코드에서 이 아닌을 수정할 수있는 문자열 리터럴을 전달합니다. 이로 인해 정의되지 않은 동작이 발생합니다. 다음과 같은 문제가 해결됩니다

간단한 수정은 다음과 같습니다 그것의 상태를 저장하는 정적 변수를 사용하기 때문에 또한, strtok 재진입이 아닌 오래된 기능이 있음을 알아 두셔야합니다

char numList[] = "14174000100,35679700322,35679700322,35679700322,35679700322,14174000999,919440710210000,1"; 
fetch_value(numList, 0, checking); 

. 새 코드에서 재진입 버전의 함수 인 strtok_r을 사용해야합니다.이 경우 상태를 저장하기위한 메모리를 전달해야합니다.

1

대신이 작업을 수행 :

int main(void) 
    { 
    char checking[100]; 
    memset(checking,0x00,sizeof(checking)); 
    char string[] = "14174000100,35679700322,35679700322,35679700322, 
    35679700322,14174000999,919440710210000,1"; 
    //now string can be modified. 
    fetch_value(&string[0],0,checking); 
    printf("checking=%s\n",checking); 
    return 0; 
    } 
관련 문제