C 프로그래밍

C프로그래밍 2023.12.15 로그인 프로그램 코드 수정 및 변화

Nohsw 2023. 12. 15. 23:13

오늘은 windows.h 헤더파일을 이용하여 로그인 프로그램을 조금 수정하였다.
프로그램 실행 시 안내를 하여 실행을 할지, 종료를 할지 선택하게 하였다.

예를 선택하면 프로그램이 실행되고, 아니오를 누르면 프로그램 종료가 된다.
 
또한 기존 프로그램에서 회원가입과 로그인 시 회원 정보 확인 차 보여주기식으로 딜레이를 주었고, 깔끔한 화면을 유지하기 위해 system("cls");를 추가하였다.
 

딜레이는 Sleep로 하였고, 5초 후에 system("cls") 함수가 작동되니 한결 더 깔끔한 느낌이다.

그리고 프로그램 종료 시 안내문구가 한번 더 출력되고 종료된다.
뭔가 windows 헤더파일을 사용하니 프로그램 느낌이 조금 나는 것 같기도 하다. 뭔가 응용하여 사용하면 재미있게 작성할 수 있을 것 같지만 취업이 되어 업무를 할 때 windows 헤더파일을 사용할 일이 있을지는 모르겠다. 다음 프로젝트로 무엇을 만들어볼지 딱히 좋은 아이디어가 떠오르지 않아 고민중이다. 그럴 때 기존 프로그램에서 코드를 더 간략하게 작성하는 방법이 있는지 확인하며 수정하는 시간을 가지면 좋을 것 같아서 만지작 해보고 있다. 오늘은 이 쯤 하고 마무리를 해야겠다.
 

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

enum userInputNum {
    input_SignUp = 1,
    input_Login = 2,
    input_Admin = 3,
    input_Exit = 4
};
// 회원 정보를 저장하기 위한 구조체
struct Member {
    char username[50];
    char password[50];
    char checkPassword[50];
};

// 전역 변수로 회원 정보 배열 선언
struct Member members[100];
int memberCount = 0;


void clearInputBuffer() { //사용자가 문자열 입력 시 무한루프 방지
    int c;
    while ((c = getchar()) != '\n' && c != EOF); //입력 버퍼를 비워주는 역할
}

void getPassword(char* password) { //비밀번호를 *로 나타내는 함수
    char ch;
    int i = 0; //사용자가 입력한 문자열 갯수

    while (1) {
        ch = _getch();

        if (ch == 13) { // Enter 키를 누르면 종료
            break;
        }

        else if (ch == 8) {
            if (i > 0) {
                printf("\b \b"); // 백스페이스 키 입력 시, 화면에서 지움
                i--;
            }
        }

        else {
            password[i++] = ch; // 비밀번호 배열에 문자 추가
            printf("*"); // 별표 출력
        }
    }

    password[i] = '\0'; // 문자열 종료를 위한 널 문자 추가
    printf("\n");
}

// 함수 선언
void signUp();
void login();
void displayMembers();
void displayMenu();
void sleep();

int main() {

    int choice;

        int i = 0;
            
        int result = MessageBoxA(NULL, "로그인 프로그램을 시작하려면 \"예\"를, 종료하려면 \"아니오\"를 선택하세요.", "알림", MB_YESNO);
            if (result == IDYES) {
                do {
                    // 메뉴 표시
                    displayMenu();

                    // 사용자 선택 입력
                    printf("숫자를 입력해주세요.: ");
                    scanf_s("%d", &choice);
                    enum userInputNum UserInputNum = choice;
                    clearInputBuffer();

                    switch (UserInputNum) {
                    case input_SignUp:
                        signUp();
                        break;

                    case input_Login:
                        login();
                        break;

                    case input_Admin:
                        displayMembers();  // 회원 목록 보기 기능 호출
                        break;

                    case input_Exit:
                        // 종료
                        printf("프로그램을 종료합니다.\n");

                        int result = MessageBoxA(NULL, "프로그램을 종료합니다.", "알림", MB_OK);
                        break;

                    default:
                        printf("잘못 입력하였습니다. 다시 입력해주세요.\n");
                    }

                } while (choice != 4);
            }
            else if (result == IDNO) {
                MessageBoxA(NULL, "프로그램을 종료합니다.", "알림", MB_OK);
            }
            else {
                MessageBoxA(NULL, "ERROR", "알림", MB_OK);
            }

    return 0;
}

// 회원 가입 함수
void signUp() {
    struct Member newMember;

    // 사용자로부터 정보 입력 받기
    printf("아이디 입력: ");
    scanf_s("%s", newMember.username, sizeof(newMember.username));

    printf("비밀번호 입력: ");
    getPassword(newMember.password);
    //scanf_s("%s", newMember.password, sizeof(newMember.password));

    printf("비밀번호 한번 더 입력: ");
    getPassword(newMember.checkPassword);

    if (strcmp(newMember.password, newMember.checkPassword) == 0) {
        // 배열에 회원 정보 추가
        members[memberCount] = newMember;
        memberCount++;

        sleep();
        printf("회원가입 완료.\n");
        return;
    }
    sleep();
    printf("회원가입 실패.\n");
}

// 로그인 함수
void login() {
    char username[50];
    char password[50];
    int i;

    // 사용자로부터 정보 입력 받기
    printf("아이디 입력: ");
    scanf_s("%s", username, sizeof(username));

    printf("비밀번호 입력: ");
    getPassword(password);

    // 등록된 회원 정보와 비교
    for (i = 0; i < memberCount; i++) {
        if (strcmp(username, members[i].username) == 0 && strcmp(password, members[i].password) == 0) {
            sleep();
            printf("로그인 성공\n");
            return;
        }
    }
    sleep();
    printf("아이디나 비밀번호가 다릅니다. 다시 입력해주세요.\n");
}

//딜레이 함수
void sleep() {
    printf("정보 확인 중입니다. 잠시만 기다려주세요.\n");
    Sleep(5000);
    system("cls");
}

// 회원 목록 보기 함수
void displayMembers() {
    char password[50];

    // 비밀번호 확인
    printf("관리자 비밀번호 입력: ");
    getPassword(password);

    // 비밀번호가 일치하는 경우에만 회원 목록 표시
    if (strcmp(password, "admin") == 0) { //displayMembers 비밀번호는 admin
        system("cls");
        printf("\n----- 사용자 리스트 -----\n");
        for (int i = 0; i < memberCount; i++) {
            printf("%d. %s\n", i + 1, members[i].username);
        }
        printf("------------------------\n");
    }
    else {
        printf("비밀번호가 다릅니다.\n");
    }
}

// 메뉴 표시 함수
void displayMenu() {
    printf("\n----- 메뉴 -----\n");
    printf("1. 회원가입\n");
    printf("2. 로그인\n");
    printf("3. 회원 목록 보기\n");
    printf("4. 종료\n");
}