#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언어를 공부하였다.
간단한 회원가입 프로그램이다.
회원가입에서는 비밀번호를 두 번 입력하여 일치하는지 확인 후 일치하면 회원가입 완료 출력 후 리스트에 저장되며 일치하지 않으면 회원가입 실패가 출력된다.
로그인에서는 아이디와 비밀번호를 입력하게 되는데 리스트에 저장되어 있는 정보를 확인 후 리스트 목록에 있으면 검증 후 로그인 성공, 실패가 출력된다.
회원가입과 로그인은 모두 비밀번호를 상대방이 알지 못하게 *로 출력되게 하였다.
회원목록보기는 한번 만들어 본 기능인데 누가 회원가입을 하였는지 출력해준다. 다만 비밀번호를 입력하여 성공하여야 회원 목록을 볼 수 있으며, 비밀번호 실패 시 기능을 이용할 수 없다.
종료는 프로그램을 종료해준다.
코드에서는 회원목록보기 선택 시 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 |