2013-08-14 2 views
-3

strcpy()의 예외;C++ 콘솔 프로그램의 strcpy 함수 예외

void recid(string str,int *begin, int *end) 
{ 
    char *f,*str2; 

    const char c1[2]=":",c2[2]="-"; 
    strcpy(str2,str.c_str()); 
    f=strtok(str2,c1); 
    f=strtok(NULL,c2); 
    *begin=atoi(f); 
    f=strtok(NULL,c2); 
    *end=atoi(f); 
} 

해결해 주시겠습니까?

+1

예외는 무엇입니까? 세그 폴트를 의미합니까? 또한 C++에서 C 문자열 함수를 사용하는 이유는 무엇입니까? 당신이 무엇을하고 있는지, * 왜 *를 모르는 경우에는 대개 나쁜 생각입니다. 그리고 하나의 문제는 str2가 초기화되지 않은 포인터라는 것입니다. – hyde

+0

할당 누락 외에, http://stackoverflow.com/questions/236129/splitting-a-string-in-c –

+0

귀하의 질문은 예외를 표시하지 않는 예외를 던지고 있습니다 ... – NREZ

답변

5

str2은 초기화되지 않은 포인터입니다. strcpy은 메모리를 할당하지 않으므로 현재 소유하지 않은 임의의 주소에 쓰려고 시도하고 코드에서 쓰기 가능하지 않을 가능성이 높습니다.

strcpy을 호출하기 전에 str2을 유효한 메모리로 지정해야합니다.

str2 = (char*)malloc(str.size()+1); 
strcpy(str2,str.c_str()); 

당신해야 또한 free 메모리 나중에 프로그램

free(str2); // cannot dereference str2 after this point 
+0

+1. 좋은 예. –

+0

고마워요,하지만 void *에서 char * –

+0

@ NadiaBarjaste로 잘못된 하나의 오류 변환이 생성됩니다 누락 된 캐스트로 내 대답을 업데이트했습니다. (캐스트가 C++에서 필요하다는 것을 잊어 버렸습니다. C에서 필수적이거나 권장하지 않습니다) – simonc

0

의 문제가 당신과 str2를 초기화하지 않음으로써 초기화되지 않은/임의 메모리 위치에 쓰기 때문이다.

최초의 솔루션 :

str2 = new char[str.size() + 1]; 
strcpy(str2, str.c_str()); 
... 
delete[] str2. 

둘째 (더 나은 솔루션) : 당신이하지 않는 한 코드에서 포인터를 사용하지 마십시오 또한

std::string str2 = str1; 

로 토큰에 대한 표준 : : ostringstream 사용을 고려 std :: strings 및 int로 변환.