2011-03-09 8 views
3

파일에서 데이터를 읽으려고하고 토큰 화하고 정렬합니다. 그러나 strtok이 실행될 때 비정상적으로 작동합니다. 때로는 작동하지 않는 경우가 있으며 매우 짧거나 홀수의 토큰이 있습니다.strtok 일관성없이 동작합니다

Valgrind의이 strtok를가 초기화되지 않은 값에 의존하기 때문에 생각하는 것 같다 (내가 생각하는) :

== 7069 == 조건부 점프 또는 이동은 초기화되지 않은 값 (들)
== 7069에 따라 달라집니다 == 0x40B61A3에서 : strtok를 (strtok.S 160)
== == 0x8048842 의해 7069 : 주 (main.c를 58) 여기서

함수이고 I는 Valgrind의 비난이 생각 :

char * getNextToken (char * line) {
char delim = ',';
return strtok (line, & delim); 라인이 내 전화의 대부분은 strtok를 할 수 NULL이기 때문에
}

이 될 수 있을까요? 여기

함수 내 호출은 다음과 같습니다

의 strcpy (연기자, getNextToken (inputLine));
strcpy (제목, getNextToken (NULL));
strcpy (charMin, getNextToken (NULL)); 나는이 원인이 될 수 무슨 아이디어와 내가 strtok를 제공 모든 값이 없습니다

/


/ 등 ... 내가 기대하고있는 무슨이다. 또한 때로는 스택 스매싱 오류가 발생합니다. 이유를 모르겠습니다.

답변

6

strtok은 두 인수 모두에 대해 Null 종료 문자열을 사용합니다. 구분 기호로 전달하지 않습니다. 이것을 시도하십시오 :

char * getNextToken (char * line){ 
    const char *delim = ","; 
    return strtok(line, delim); 
} 
+0

많은 의미가 있습니다. 고맙습니다! – jrisebor

+0

@ Snipe07 : 천만에! –

1

첫 번째 대답은 strtok()과 관련하여 적절합니다. strtok은 strcpy()에 대한 목적지에 할당 한 배열보다 크다면, strtok이 발견 한 토큰에 대한 포인터를 리턴 할 것이기 때문에 그 것이다. 행복하게 넘칠 것입니다.

strcpy() 대신 strdup()를 사용하는 것이 좋습니다.

관련 문제