공룡호가 사는 세상 이야기

스트링 처리를 잘못하는 바람에 굉장히 고생할 뻔 했다.
찾아 준 원석군에게 감사를 표하며. 플밍노트 한페이지 기록.

* 요약 *
1. 파일에서 특정부분을 스트링 배열로 하여 메모리에 로드 하였다.
2. 그런데 출력 할 때 마다, 스트링에 원하지 않는 문자가 포함되어 있다.
3. 에러를 찾기 위해 스트링을 읽어 오는 부분을 뚫어져라 보고, 바꾸어도 봤지만 소용없었다.
4. 신기한 것은, 실행을 할 때마다 원하지 않는 문자는 바뀌고, 때론 없어지기도 한다.

* 해결 *
1. 스트링의 마지막에 널 문자를 집어 넣지 않고, 스트링 포인터를 printf()함수로 전달했다.
2. printf()함수는 받은 스트링 포인터부터 널문자 까지 찍는데, 널문자가 없으니 파일의 끝을 알 수 없다.

* 결론 *
C 프로그래밍을 처음 공부하여 배열과 포인터를 배울때 가장 먼저 배우는 개념이다. 스트링의 마지막에는 널문자가 들어갑니다. 라고. '들어가는 구나'라고만 생각했지, 왜 반드시 들어가야 하는지 이유는 한번도 생각 해 보지 않았던 내 잘못이기도 하지만, 분명히 눈으로 보고 배울 수 있는 것에는 한계가 있다.
그래서 다들 프로젝트를 하는 모양이다. =_=

*파일포인터가 위치하는 부분부터 40바이트를 긁어 메모리에 올리고, 출력*
#define MAX_BOOK_NAME 40
char b_name[MAX_BOOK_NAME];
for(int i=0; i<MAX_BOOK_NAME; i++)
fscanf(pIF, "%c", b_name + i);
printf("String : %s\n", b_name);


*다음은 수정된 버전*
#define MAX_BOOK_NAME 40
char b_name[MAX_BOOK_NAME + 1] = {0};
for(int i=0; i<MAX_BOOK_NAME; i++)
fscanf(pIF, "%c", b_name + i);
printf("String : %s\n", b_name);


메모리로 올리는 배열의 마지막에 널문자를 하나 추가해 준 것으로 해결.
간단하지만, 굉장히 찾기 어려웠다.
저 방법대로 하려면 40바이트만큼 for문을 돌려 화면에 찍어 주어야 하겠지만, 스트링이 한글이면 불가능. 작지만 큰 걸 깨달은 것 같다.