easy software

C언어 구조체배열, 포인터, strcmp, strcpy를 이용한 전화번호 관리 프로그램 본문

C언어/기타

C언어 구조체배열, 포인터, strcmp, strcpy를 이용한 전화번호 관리 프로그램

JAVA 웹개발자 2015. 3. 8. 13:19

오랜만에 C언어에 대한 글을 작성합니다.

 

이번글에서는 윤성우의 열혈 C 프로그래밍의 내용을 거의 모두 이해하고 있어야

 

해결할 수 있는 문제입니다.

 

문자열에 대한 이해와, 각종 반복, 조건문, 구조체와 포인터, 배열에 대한 개념이 들어갑니다.

 

그렇기 때문에 위의 개념에 익숙하지 않거나, 잘 모르겠다고 하시면 제 블로그에서

 

한번쯤 개념을 확립하시고 코드를 보시기 바랍니다.

 

프로그램의 이름은 전화번호 관리 프로그램이며, 아래의 기능을 가지도록 해야 합니다.

 

-입력 : 이름과 전화번호의 입력

-삭제 : 이름을 입력하여 해당 이름의 정보 삭제

-검색 : 이름을 입력하여 해당 이름의 정보 출력

-전체출력 : 저장된 모든 이름과 전화번호 정보를 출력

 

이 프로그램을 작성하면서 정말 많은 고민과 시간을 투자했습니다.

 

저도 초보중에 상초보이다보니 어렵더라구요.

 

그리고 출력 결과는 아래와 같아야 합니다.

 

 

 

 

 

코드를 먼저 보여드리고 설명을 하겠습니다.

 

 

 

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

 

//추후 유지보수를 편히 하기위해 100이란 숫자를
//MAX_NUM으로 설정, 100을 200으로 바꾸면
//MAX_NUM은 200이 됨
#define MAX_NUM 100

 

//사용자의 정보를 저장하는 구조체
typedef struct{
 char name[30];
 char number[30];
}User;

 

void insert(User* ptr, int* num);
int deleted(User* ptr, int* num);
int search(User* ptr, int* num);
void printAll(User* ptr, int* num);

 

int main(void){
     int input;
     User user[MAX_NUM]; //사용자 정보를 저장할 구조체 배열
     int person = 0; //저장된 user수

 

     //메뉴 선택
     while (1){
          printf("***** Menu ***** \n");
          printf("1. Insert \n");
          printf("2. Delete \n");
          printf("3. Search \n");
          printf("4. Print All \n");
          printf("5. Exit \n");

          printf("Choose the item: ");
          scanf("%d", &input);

 

          if (input == 1){
               printf("\n[INSERT] \n");
               insert(user, &person);
          }
          else if (input == 2){
               printf("\n[Delete] \n");
               deleted(user, &person);
          }
          else if (input == 3){
               printf("\n[Search] \n");
               search(user, &person);
          }
          else if (input == 4){
               printf("\n[Print All] \n");
               printAll(user, &person);
          }
          else if (input == 5){
               printf("\n[Exit] \n");
               return 0;
          }
          else
               printf("\nerror! ReTry! \n\n");
         }

     return 0;
}

 

//사용자의 정보를 삽입하는 함수
void insert(User* ptr, int* num){

     //유저정보가 꽉 차지 않으면
     if (*num < MAX_NUM){
          printf("Input Name: ");
          scanf("%s", ptr[*num].name);
          printf("Input Tel Number: ");
          scanf("%s", ptr[*num].number);

          (*num)++;
          printf("  Data Inserted \n\n");
     }
     //유저 정보가 꽉 차면
     else
          printf("  Data Full \n\n");
    }

 

//사용자의 정보를 삭제하는 함수
int deleted(User* ptr, int* num){
     char name[30];
     int i, j;

 

     //유저 정보가 한개라도 남아있으면
     if (*num > 0){
          printf("Input Name: ");
          scanf("%s", name);

 

          for (i = 0; i < MAX_NUM; i++){
               //문자열이므로 비교하기위해 strcmp사용
               if (strcmp(name, ptr[i].name) == 0){

                    (*num)--;
                    printf("  Data Deleted \n\n");

 

                    //데이터가 가득 차지 않았다면
                    if (i != MAX_NUM - 1){
                         for (j = i; j < MAX_NUM; j++){
                              //문자열이므로 strcpy를 사용하여 데이터 복사
                              strcpy(ptr[j].name, ptr[j + 1].name);
                              strcpy(ptr[j].number, ptr[j + 1].number);
                         }


                     //구조체 배열의 마지막을 NULL로 바꿈
                     *ptr[MAX_NUM - 1].name = NULL;
                     *ptr[MAX_NUM - 1].number = NULL;
                }


                //데이터가 가득 찼다면
                else{
                     //구조체 배열의 마지막을 NULL로 바꿈
                     *ptr[MAX_NUM - 1].name = NULL;
                     *ptr[MAX_NUM - 1].number = NULL;
                }
                return 0;
               }
          }
          printf("Not Found \n\n");
          return 0;

}
//저장된 유저 정보가 없다면

else{
    printf("  No Data \n\n");
    return 0;

}

}

 

//사용자의 정보를 검색하는 함수
int search(User* ptr, int* num){
     char name[30];
     int i;

 

     //저장된 데이터가 있다면
     if (*num > 0){
          printf("Input Name: ");
          scanf("%s", name);

 

         for (i = 0; i < MAX_NUM; i++){
               //strcmp는 문자열이 일치할때 0을 반환
               //0은 C언어에서 거짓을 의미
               //그러므로 ! 을 붙여 참으로 변경하여 실행
               if (!strcmp(name, ptr[i].name)){

                    printf("Name : %s ", ptr[i].name);
                    printf("Tel : %s \n", ptr[i].number);

                    printf("  Data Found \n\n");
                    return 0;
               }
          }
          printf("Not Found \n\n");
          return 0;
     }
     else{
          printf("  No Data \n\n");
          return 0;
     }
}

 

//저장된 모든 이름과 전화번호 정보를 출력하는 함수
void printAll(User* ptr, int* num){
     int i = 0;

 

     if (*num > 0){
          for (i = 0; i < *num; i++){
               printf("Name : %s ", ptr[i].name);
               printf("Tel : %s \n", ptr[i].number);
          }
          printf("  Data Print \n\n");
     }
     else
          printf("  No Data \n\n");
    }

 

 

지금까지 제 블로그에서 작성했던 코드들과는 차원이 다를만큼 깁니다.

 

프로그램은 별거 없어보이는데, 코드는 조금 길죠?

 

하지만, 이 170여줄의 코드가 길다고 느끼시면 안됩니다.

 

자꾸 익숙해져야 차후에 더 큰 프로그램과 프로젝트를 수행할 수 있을 테니까요.

 

그럼 코드설명을 간단히 하겠습니다. 주석이 잘 작성되어 있기 때문에 짧게 하겠습니다.

 

 

 

처음에 매크로를 정의해서 코드내에서 쓰일 숫자가 변경되면, 전체적으로 편리하게

 

유지보수를 할 수 있도록 하였습니다.

 

그리고 구조체를 정의하고 main 함수에서는 메뉴와 선택할 수 있는 코드를 작성했습니다.

 

insert 함수에서는 유저 정보를 입력하도록 했으며, 포인터를 사용하여

 

main함수의 변수에 접근하도록 했습니다.

 

deleted 함수에서는 사용자의 정보를 삭제하도록 되어있습니다.

 

사용자가 입력한 문자열이 저장되어있는지 확인하기위해 strcmp 함수를 사용하였고,

 

만약 데이터가 삭제되면, 구조체 배열을 앞으로 한칸씩 땡겨야 하기 때문에

 

strcpy를 사용하여 값을 복사하는 과정도 포함되어 있습니다.

 

그리고 구조체 배열의 마지막 값을 NULL로 바꾸어 주도록 했습니다.

 

search 함수에서는 strcmp를 사용하여, 사용자가 입력한 이름이

 

구조체 배열에 저장되어 있는지를 검사합니다.

 

printAll 함수는 구조체 배열에 저장된 데이터를 모두 출력해 줍니다.

 

 

설명이 조금 부족하다고 느끼시면, 주석과 함께 보도록 하세요.

Comments