C 프로그래밍

C프로그래밍 23.12.10

Nohsw 2023. 12. 11. 00:07
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.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();

int main() {
    int choice;

    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");
            break;
        default:
            printf("잘못 입력하였습니다. 다시 입력해주세요.\n");
        }

    } while (choice != 4);

    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++;

        printf("회원가입 완료.\n");
        return;
    }
    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) {
            printf("로그인 성공\n");
            return;
        }
    }

    printf("아이디나 비밀번호가 다릅니다. 다시 입력해주세요.\n");
}

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

    // 비밀번호 확인
    printf("관리자 비밀번호 입력: ");
    scanf_s("%s", password, sizeof(password));

    // 비밀번호가 일치하는 경우에만 회원 목록 표시
    if (strcmp(password, "admin") == 0) { //displayMembers 비밀번호는 admin
        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");
}

오늘은 Visual Studio로 C언어를 공부하였다.

간단한 회원가입 프로그램이다.

회원가입에서는 비밀번호를 두 번 입력하여 일치하는지 확인 후 일치하면 회원가입 완료 출력 후 리스트에 저장되며 일치하지 않으면 회원가입 실패가 출력된다.

로그인에서는 아이디와 비밀번호를 입력하게 되는데 리스트에 저장되어 있는 정보를 확인 후 리스트 목록에 있으면 검증 후 로그인 성공, 실패가 출력된다.

회원가입과 로그인은 모두 비밀번호를 상대방이 알지 못하게 *로 출력되게 하였다.

회원목록보기는 한번 만들어 본 기능인데 누가 회원가입을 하였는지 출력해준다. 다만 비밀번호를 입력하여 성공하여야 회원 목록을 볼 수 있으며, 비밀번호 실패 시 기능을 이용할 수 없다.

종료는 프로그램을 종료해준다.

 

프로그램 시작메뉴
회원가입 성공
패스워드가 서로 다르게 입력되어 회원가입 실패
로그인 성공메뉴
회원목록보기는 비밀번호가 입력되어야 볼 수 있다. 관리자 비밀번호는 admin
비밀번호 *로 출력되게 변경

 

코드에서는 회원목록보기 선택 시 scanf로 되어있어 비밀번호가 그대로 노출되지만 getPassword 함수로 변경하면 쉽게 *로 변경이 가능하다.

이렇게 chatGPT의 도움을 받아 Visual Studio 프로그램으로 회원가입 프로젝트가 완료되었다.

원래 하고싶었던 부분을 성공하였다. 제일 하고 싶었던 부분은 회원가입 시 리스트로 저장하여 로그인 했을 때 저장된 정보를 확인 후 정보가 있으면 아이디와 비밀번호가 일치하는지 확인 후 로그인 성공, 실패를 출력하는 부분이였다.

간단한 코드같으면서도 꽤 복잡하고 어려웠지만 계속 연습하다보면 언젠가 나의 기술로 되겠지라는 생각으로 코드를 다시 지우고 작성하는 연습을 해야겠다.

다음 목표는 코드를 조금 수정하여 리눅스에서도 성공했으면 좋겠다.

 

'C 프로그래밍' 카테고리의 다른 글

리눅스 C프로그래밍 23.12.12  (0) 2023.12.13
리눅스 C프로그래밍 23.12.11  (0) 2023.12.11
C프로그래밍 23.12.10  (0) 2023.12.10
C프로그래밍 23.12.09  (0) 2023.12.09
C프로그래밍 23.12.08  (0) 2023.12.08