[완료]중첩된 구조체 내의 변수를 동적 할당받는법에 대한 질문입니다.

copower의 이미지

안녕하세요.
중첩 구조체를 이용한 링크드 리스트 구현 중에 <동적 할당>을 어떻게 받아야할지에 대해서 질문글을 올립니다.
사실 구조체나 포인터에 대한 지식이 완벽 하지 않아서... 스스로 편하자고 배열로 크기를 잡아버리고 시작한 것이 화근이 되었습니다...;;;
아래 소스에서처럼 첫 구조체는 두번쨰 구조체내에 포함되고 두번째 구조체는 다시 세번쨰 구조체에 포함되는 형식인데요...
현재 텍스트 파일에 도서의 정보를을 저장해두고, 프로그램 실행시에 로드해서 사용하는 방식으로 구조체를 사용하고 있습니다.
문제는... 제목, 저자, 출판사를 동적 할당으로 크기를 이용하고 싶은데요, 텍스트 파일에서 버퍼로 읽어 들이는 부분에서 해당 제목이나 저자를 sizeof()와 같은 함수를 이용해서 크기를 구한뒤에,
동적으로 할당받아야하는것인지...
아니면, 다른 방법이 있는 것인지 궁금합니다...
아참 추가적인 질문으로... 이 세가지 구조체에 typedef과 해당 타입으로 사용하겠다고 } 이후에 이름을 달기도 했는데...
이부분을 어떻게 해야 논리적으로 깔끔한 것인지도 궁금합니다. 구조체 선언 부분엔

struct b_Node *booknext
struct b_Node *bheadnode

이런식으로 써놓고서 실제 프로그램에서 사용할때는 booknode나 booklinkedlist를 이용했는데.... 구조체에대한 명확한 개념이 없이 사용하다보니 참 이상한(?) 구조체가 되어버렸네요...

구조체 부분입니다..

struct Book 
{
	// 제목, 저자, 출판사, 출판일, 도서번호, 책상태(대출여부)
	char title[30];
	char author[20];
	char publisher[20];
	int date;
	int bookNumber;
	int bookState;
};
 
typedef struct b_Node 
{
	struct Book *bookdata;
	struct b_Node *booknext;
}booknode;
 
typedef struct b_LinkedList 
{
	int totalBook;
	struct b_Node *bheadnode;
}booklinkedlist;

텍스트 파일에서 읽어오는 부분입니다..

int loadBookData(struct b_LinkedList* b_list)
{
	FILE *fp;
	char buffer[1024];
	int i;
	int totalBook;
	char* temp;
	char delimiter[] = "\t";
	struct Book* book;
 
	fp = fopen("BookList.txt", "r");
 
	if(fp==NULL)
	{
		fp = fopen("BookList.txt", "w");
	}
	fgets(buffer,1024,fp);
	totalBook = atoi(buffer);
	for(i = 0 ; i < totalBook ; i++)
	{
		fgets(buffer,1024,fp);
		book = (struct Book*) malloc(sizeof(struct Book));
 
		temp = strtok(buffer, "\t");
		strcpy(book->title, temp);
		temp = strtok(NULL, "\t");
		strcpy(book->author, temp);
		temp = strtok(NULL, "\t");
		strcpy(book->publisher, temp);
		temp = strtok(NULL, "\t");
		book->date = atoi(temp);
		temp = strtok(NULL, "\t");
		book->bookNumber = atoi(temp);
		temp = strtok(NULL, "\t");
		book->bookState = atoi(temp);
 
		addBookNode(b_list, book);
	}
	fclose(fp);
	return 0;
}

oosap의 이미지


http://kangcom.com/sub/view.asp?sku=199602060002&mcd=571

리스트 구현은 이 책에 아주 잘 나와있어요.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

copower의 이미지

	char* title;
	char* author;
	char* publisher;

일단 구조체 내부에서 배열로 사용중인 변수들을 포인터로 변경했고,
입력 받은 스트링을 임시로 buffer에 저장한후에 strlen을 사용해서 길이를 구했습니다.
이 길이를 malloc에 이용했더니... 입력받은 만큼의 할당이 되는것 같습니다.
(확실한지는 모르겠지만, 제가 디버그 돌려가면서 보기에는 맞는것 같네요...)

결과적으로 이부분이...

		temp = strtok(buffer, "\t");
		strcpy(book->title, temp);

이렇게 변경되었네요... 다른 부분도 마찬가지입니다.

		temp = strtok(buffer, "\t");
		book->title = (char*) malloc(sizeof(char)*strlen(temp));
		memset(book->title,0,sizeof(strlen(temp)));
		strcpy(book->title, temp);

답변 달아주셔서 감사합니다...:)

raymundo의 이미지

malloc()을 호출할 때 크기를 strlen(temp) + 1 을 해야 끝에 '\0'이 복사될 공간까지 확보가 됩니다. 그것만 고치시면 다 된 것 같은데요? :-)

좋은 하루 되세요!

copower의 이미지

널문자를 문제를 안드로메다로 보내놓고 있었네요...
다시 워프~
답변 감사합니다...:)

oosap의 이미지

답변을 너무 성의 없이 한 것 같았는데 제가 알려드린 책을 읽어보셨나요?
답변이 감사하다 하셔서 저 또한 감사하네요.

Thanks for being one of those who care for people and mankind.
I'd like to be one of those as well.

copower의 이미지

이 정도는 검색만해도 꽤 나오는부분인데 제가 열심히하지 않았던게 문제였죠...
말씀해주신 책은 읽어보지 못하고, 프로그램을 잘하는 친구들에게 주말에 술한잔(?) 맥이면서 물어보고 해결했네요...
다 알고 있던 내용인데...
뭐랄까요, 정말 내것이 되지 않아서 바로바로 떠오르지 않았던것 같네요.
역시 코딩은 절대적인 시간이 실력을 좌우하는것 같습니다. :)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.