strtok로 토큰 쪼개서 배열에 저장하는데 오류가 생깁니다.
글쓴이: Hubert Lee@Google / 작성시간: 화, 2019/10/15 - 11:17오전
소스에 궁금한 부분을 주석 달아보겠습니다 ㅠㅠ
도대체 어떤 논리적 오류인지 감이 전혀 안잡힙니다.
#include <stdio.h> #include <string.h> int main(){ FILE *fp = fopen("optab.txt","r"); char buf[100], * ptr, * store[100]; int cnt=0; while (feof(fp)==0){ fgets(buf,sizeof(buf),fp); ptr = strtok(buf,","); while(ptr!=NULL){ // printf("%s\n",ptr); //store[cnt]=ptr; // 1)번 의문. 제 생각에는 이 방법이나 strcpy처럼 하면 배열에 저장이 되어야 할 것 같은데 저장이 안됩니다. 이상한 값이 반복해서 들어갑니다. //2)번 의문. 심지어 strcpy는 segmentation fault가 뜹니다. 어째서..? ptr은 NULL이 못올텐데... ptr값을 print해보면 NULL로 나옵니다. strcpy(store[cnt], ptr); // 3)번 의문. 가장 큰 의문은 while 문 내에서 ptr 값을 출력하면 정상적으로 토큰이 분리되어 출력됩니다. ptr=strtok(NULL,"\n"); //store[cnt]=ptr을 하고 while문 내에서 store배열 출력해도 정상적으로 출력이 되어요. 그런데!!!! cnt++; } } fclose(fp); for(int j=0;j<10;j++){ printf("store:%s",store[j]); // 이렇게 while문 바깥에서 출력하면 토큰이 정상분리가 안되고 optab.txt의 맨 끝 값만 출력됩니다. 반복해서요. 도대체 왜!!!????? ㅠㅠ. } return 0; }
optab.txt
ADD,18
AND,58
COMP,28
LDA,00
STA,0C
Forums:
store는 포인터 배열이지 char 배열이 아닙니다
store는 포인터 배열이지 char 배열이 아닙니다. 공간을 할당받지 않은 char 포인터 배열에 strcpy를 하면 안되죠.
그렇군요. 감사합니다.
그렇군요. 감사합니다.
동적 배열을 써서 해결했습니다!
buf_t[100] 을 만들어서 buf 의 내용을
buf_t[100] 을 만들어서 buf 의 내용을 buf_t 에 복사한 다음 buf_t 를 가지고 strtok 를 해 보세요.
그리고 while loop 도 feof 말고 fgets 로 직접 control 하세요
다음 코드는 char **store 가 100 개 있다는 의미죠. 즉, 메모리 할당이 되어 있지 않은 **store 에 strcpy 를 해서 segfault 가 발생 하는 겁니다.
의도하신 바는
로 선언해야 하지 않았을까 싶네요
마지막으로 strtok 는 thread safe 에 취약 하므로 strtok_r 또는 strsep 를 사용하라고 권장하고 있습니다.
답변 감사드립니다!
답변 감사드립니다!
늦게 답을 달아 죄송합니다. 여러 번 곱씹어 보느라 늦었습니다.
그런데 feof말고 fgets를 써야 하는 이유가 있는지요?
선언만 하고 할당을 안한 문제는 동적배열로 해결했습니다. 감사합니다!
fgets/feof 에 대해서는 https:/
fgets/feof 에 대해서는 https://kldp.org/node/3651 참고해 보세요.
그 외에도 google 에서 두 함수로 검색 하시면 해당 현상에 대한 글들을 쉽게 찾을 수 있습니다.
댓글 달기