2012-01-10 8 views

답변

1

문제는 군단입니다.

문자열 "1-2-3-4"이 읽기 ​​전용 메모리에 저장되어 있으므로 strtok()이 (첫 번째 토큰을 분리하기 위해) 수정하면 프로그램이 충돌하기 때문에 코어 덤프가 발생할 것으로 예상됩니다. 충돌은 strtol()에 있습니다. strtok()의 반환 값이 NULL임을 제안합니다.

strtok()의 첫 번째 호출은 문자열을 인수로 사용합니다. 두 번째 호출은 그 자리에 NULL을 전달하여 '지난 시간에 중단 한 부분부터 계속'을 나타냅니다. 서면으로 문자열이 수정 가능한 경우 1을 네 번 파싱합니다.

이 (안된하지만) 수정 가까운 :

일반적으로
char input[] = "1-2-3-4"; 
char *data = input; 
for (int i = 0; i < 4; i++) 
{ 
    char *token = strtok(data, "-"); 
    if (token != 0) 
    { 
     long int a = strtol(token, NULL, 10); 
     cout << a << endl; 
    } 
    data = NULL; 
} 

, 당신은 strtol()에서 오류 검출을 할 필요가; 더구나, 이렇게하는 것은 아주 혼란 ​​스럽습니다. 그러나 샘플 문자열을 사용하면 걱정할 필요가 없습니다.

+1

당신이 나를 이길이 시간! =) –

+0

아 ~; 당신이 어떤 것을 이기면, 당신은 약간을 잃습니다. 최대 득표를하십시오. –

1

strtok 전화는 오류이며 strtol이 아닙니다. 문자열 리터럴에 strtok을 호출 할 수 없습니다. 문자열을 수정하려고하기 때문입니다. 문자열 리터럴을 수정하면 C++에서 정의되지 않은 동작이 발생합니다.

1

문제가 이미 논의 된 바와 같이, 내가 다른 접근 방식을 보여주고 싶습니다

#include <stdio.h> 
#include <string.h> 

    int main() 
    { 
     long int a; 
     char str[] ="1-2-3-4"; 
     char * pch; 

     pch = strtok (str,"-"); 
     while (pch != NULL) 
     { 
     a = strtol(pch,(char**)NULL,10); 
     cout << a <<endl; 

     pch = strtok (NULL, "-"); 
     } 
     return 0; 
    }