c로 주소록 짜기인데..

buleless의 이미지

파일을 불러와서 이름 나이 성별로 검색하여 출력하는 것 인데요 ;
전체출력만 되네요...
좀 도와주세요..
검색을 하니까 전화번호부가 저장되어있지 않다고 그러네요..ㅠ

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>

typedef struct address
{
	char name[10];
	int age[10];
	char add[50];
	char tel[20];
	char sex[10];
}TEL;

TEL book[100];
int top=0;

void name();
void sex();
void end();
void select();
void load();

void main()
{
	int no;

	while(1)
	{
		system("cls");
		puts("┏━*메뉴*━┓");
		puts("┃ 1.이 름  ┃");
		puts("┃ 2.성 별  ┃");
		puts("┃ 3.출 력  ┃");
		puts("┃ 4.종 료  ┃");
		puts("┗━━━━━┛");
		printf("\n 선 택[ ] \b\b\b");
		scanf("%d",&no);
		fflush(stdin);

		switch(no)
		{
		case 1 : { name(); break; }
		case 2 : { sex(); break; }
		case 3 : { load(); break; }
		case 4 : { end(); break; }
		}
		printf("아무키나 누르세요*^___^*\n");
		getch();
	}
}
void load()
{
	char name[10], add[50], tel[10], sex[10];
	int age[10];
	
	FILE *fp1;
	if((fp1=fopen("input.txt","r")) !=NULL)
	{
		while((fscanf(fp1,"%7s %d %19s %13s %2s", &name, &age, &add, &tel,&sex)) !=EOF)
		{
		printf("%s %d %s %s %s\n", name,age,add,tel,sex);
		}

	}
	else
	{
		printf("input 파일이 없습니다.\n");
	}
	fclose(fp1);
}

void name()
{
	char copyname[15];
	int i;

		if(top == 0)
	{
		printf("전화번호부가 저장되어있지 않아 검색할 수 없습니다..\n");
		return;
	}

	printf("검색할 이름를 입력하세요 : ");
	gets(copyname);


	for(i=0;i<top;i++)
		{
			if(strcmp(book[i].name, copyname)==0)
			{
				printf("찾는 문자열이 없습니다..\n");
			}

			if(strcmp(book[i].name, copyname)==0)
			{
				printf("%s %d %s %s %s\n",book[i].name,book[i].age,book[i].add,book[i].tel,book[i].sex);
				return;
			}
		}
}
void sex()
{ 
	char sex[10];
	int i;
	 
	printf("\n성별을 입력하기(남/여): ");
	gets(sex); 
		for(i=0; i<=top; i++)
		{
			if(!strcmp(book[i].sex, sex))
			{
			printf("%s %d %s %s %s\n", book[i].name,book[i].age,book[i].add,book[i].tel,book[i].sex);
			}
		}
} 

void end()
{
	printf("\n\n\t사용해주셔서 감사합니다.^-^*\n\n\n");
	exit(1);
}
flyingykk의 이미지

load() 함수의 while 루프에서 fscanf() 성공할 때마다 전역 변수 top을 증가시켜야할 것 같습니다.

lifthrasiir의 이미지

buleless wrote:
		while((fscanf(fp1,"%7s %d %19s %13s %2s", &name, &age, &add, &tel,&sex)) !=EOF)
		{
		printf("%s %d %s %s %s\n", name,age,add,tel,sex);
		}

load() 함수인데 왜 출력을 하나요? -.- 아무래도 이 함수를 다음과 같이 바꿔야 하지 않을까 싶습니다.

void load()
{
   FILE *fp;
   int result;

   top = 0; /* 레코드 갯수 초기화 (이건 파일을 열든 안 열든 똑같죠) */
   fp = fopen("input.txt", "r");
   if(fp != NULL)
   {
      while(1) {
         result = fscanf(fp, "%7s %d %19s %13s %2s",
            book[top].name, &book[top].age, book[top].add, book[top].tel, book[top].sex);
         if(result == EOF) break;
         top++;
      }
   }
   else
   {
      printf("input 파일이 없습니다.\n");
   }
   fclose(fp);
}

그리고 name() 함수에서 book[i].name과 copyname을 비교하는 과정이 두 번 들어 있습니다. 그대로 하면 찾는 문자열이 없다-_-고 나온 후에 결과가 나오겠지요. 아래 코드를 지우고 for 문 바깥쪽(즉 name 함수 맨 끄트머리)에 그냥 printf 문을 넣으면 될 것 같습니다.

         if(strcmp(book[i].name, copyname)==0)
         {
            printf("찾는 문자열이 없습니다..\n");
         }

- 토끼군

덤: 확인 안 해서 코드가 오류 날 수도 있습니다. 물론 그 정도는 직접 고치는 센스 :)