2013-04-10 2 views
0

char *를 입력으로 사용하여 공백을 사용하여 분할하고 문자열 배열에 토큰을 다시 저장하는 C 함수를 작성했습니다.함수가 실행되지만 세분화 오류가 발생합니다. C

내 코드가 제대로 실행되지만 실행을 완료하기 전에 세그먼트 화 오류가 발생합니다. 누구든지 저에게 잘못된 것을 보여 줄 수 있습니까?

void parseCommand(char *msg) 
{  
    char buffer[25][30]; 
    char *tok; 
    char *msgCopy; 
    //strcpy(msgCopy,msg); 
    msgCopy =msg; 
    tok = strtok(msgCopy," "); 
    strcpy(buffer[0],tok); 
    int i=1; 
    while(tok != NULL){ 

     tok = strtok (NULL, " "); 
     strcpy(buffer[i],tok); //me line eke error eka 
     printf("%d : %s\n",i,buffer[i]); 
     i++; 
    } 
} 
+0

당신이 실패 할 수 입력을 지정하지 않았습니다합니다. 나는 너무 긴 문자열로 "버퍼"를 단순히 오버 플로우시킨 것 같다. – Netch

답변

3

strtok 마침내이 더 이상 토큰이고, 당신이 NULL에서 읽기를 시도 strcpy(buffer[i],tok);를 부르는 신호를 NULL를 반환합니다. 이로 인해 segfault가 발생합니다.

당신은 루프 상태로 strtok를 이동하여 해결할 수 있습니다 :

while((tok = strtok (NULL, " ")) != NULL){ 
    strcpy... 

또는 break 문 사용하여 루프를 탈출 :

while(1){ 
    tok = strtok (NULL, " "); 
    if(tok == NULL) break; 
    strcpy... 
+0

위생적인'for (tok = strtok (msgCopy, ""); tok; tok = strtok (NULL, "")) {}'루프를 사용하면이 문제를 피할 수 있습니다. (또는 더 나은 : strtok() alltogether 및 strchr() 또는 strspn()/strcspn() 사용하여 피하십시오 – wildplasser

+0

오, 이제 그것을 얻을. 그 점을 지적 해 주셔서 감사합니다. –

관련 문제