오늘은 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");
}
'C 프로그래밍' 카테고리의 다른 글
C프로그래밍 23.12.17 회원가입 수정 (0) | 2023.12.17 |
---|---|
C프로그래밍 2023.12.16 데이터 저장 (0) | 2023.12.16 |
2023.12.15 새로운 프로젝트 도전 (0) | 2023.12.15 |
리눅스 C프로그래밍 23.12.13 프로그램 소스 코드 (0) | 2023.12.13 |
리눅스 C프로그래밍 23.12.12 (0) | 2023.12.13 |