0404 개발일지

2025. 4. 4. 19:39·C언어
#include <stdio.h>
#include <string.h>

typedef struct fre
{
    char name[10];
    char id [20];
    char password[30];
    char phone[20];
    char age[5];

}friend;


int main()
{
    FILE *fp;
    friend myfree[30];

    char user_input_id[20];
    char user_input_pw[20];
    printf("[로그인 UI] \n");
    
    int switch_1 = 1;
    while(switch_1==1)
    {
        printf("ID: ");
        scanf("%s", user_input_id);
        printf("유저가 입력한 아이디: %s\n", user_input_id);

        fp = fopen("all_users.bin", "rb");  // 파일 읽기

        int break_ = 0; // 중복일때 반복을 안하게 만드는 변수

        for (int i = 0; i <= 2; i ++)
        {
            fread((void*)&myfree[i], sizeof(myfree[i]), 1, fp);
            if (strcmp(user_input_id, myfree[i].id) == 0)
            {
                printf("PW: "); // 입력한 아이디가 존재하면 비번 입력
                scanf("%s", user_input_pw);

                if (strcmp(user_input_pw, myfree[i].password) == 0) // 비번 맞으면
                {
                    printf("로그인 되었습니다.\n");
                    switch_1 = 0;
                }

                else
                {
                    printf("비밀번호가 틀렸습니다.\n");
                    printf("비밀번호를 다시 입력해주세요.\n");
                    break;
                }
            }

            else
            {
                printf("없는 아이디 입니다.\n");
                printf("다시 입력해주세요.\n");
                break;
            }   
        }    
    }
    printf("로그인 후 메인화면");

}

 

비번을 입력할때 아이디가 맞는다는 선제조건이 있어야하니까

아이디 확인 후 그 안에 if절을 넣어서 비번 검사를 하려고 했는데

비번이 틀렸을 때, 비번이 아니라 아이디를 또 다시 입력하라고 하니까 답답했다.

 

그래서 while문을 2개를 만들었는데

이렇게하면 문제가 똑같은 비번을 쓰는 다른 유저가 있을 때 겹치니까

어떤 유저의 비번과 검사해야하는지 명확하지가 않아서 while문을 따로 쓰는건 안될거같다.

    int switch_2 = 1;
    while(switch_2 == 1) // 비번 확인
    {
        printf("PW: "); // 입력한 아이디가 존재하면 비번 입력
        scanf("%s", user_input_pw);

        for (int i = 0; i <= 2; i ++)
        {
            if (strcmp(user_input_pw, myfree[i].password) == 0) // 아이디가 들어있고,
            {
                printf("로그인 되었습니다.\n");
                switch_2 = 0;
                break;
            }

            else
            {
                printf("비밀번호가 틀렸습니다.\n");
                printf("다시 입력해주세요.\n");
                break;
            } 
        }   
    }

 

 

최종 완성된 로그인 기능

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

typedef struct fre
{
    char name[10];
    char id [20];
    char password[30];
    char phone[20];
    char age[5];

}friend;


int main()
{
    FILE *fp;
    friend myfree[30];

    int check_id;
    char user_input_id[20];

    char user_input_pw[20];
    printf("[로그인 UI] \n");
    
    int switch_1 = 1;
    while(switch_1==1)
    {
        printf("ID: ");
        scanf("%s", user_input_id);
        printf("유저가 입력한 아이디: %s\n", user_input_id);

        fp = fopen("all_users.bin", "rb");  // 파일 읽기

        int break_ = 0; // 중복일때 반복을 안하게 만드는 변수

        for (int i = 0; i <= 5; i ++)
        {
            fread((void*)&myfree[i], sizeof(myfree[i]), 1, fp);
            if (strcmp(user_input_id, myfree[i].id) == 0) // 아이디가 존재하면 비번 입력
            {
                printf("아이디가 존재합니다.\n");
                check_id = i;
                switch_1 = 0; // 아이디 반복문 탈출
                break;
            }

            else
            {
                printf("없는 아이디 입니다.\n");
                printf("다시 입력해주세요.\n");
                break;
            }   
        }    
    }

    int switch_2 = 1;
    while(switch_2 == 1) // 비번 확인
    {
        printf("PW: ");
        scanf("%s", user_input_pw);
 

        if (strcmp(user_input_pw, myfree[check_id].password) == 0) // 아이디가 들어있고,
        {
            printf("로그인 되었습니다.\n");
            switch_2 = 0; // 비번 반복문 탈출
            break;
        }

        else
        {
            printf("비밀번호가 틀렸습니다.\n");
            printf("다시 입력해주세요.\n");
            break;
        } 
    }

    printf("로그인 후 메인화면");

}

 

유저가 입력한 아이디가 몇번째인지 check_id 변수에 저장하고

비밀번호 확인하는 반복문에서 해당 check_id 변수에 저장된  비밀번호를 확인해서

유저가 입력한 비밀번호가 맞는지 검사한다.

 

이로써 같은 비번을 갖고있는 다른 유저와 구별할 수 있게 되었다.

 

 

 

 

 

'C언어' 카테고리의 다른 글

유저찾기  (0) 2025.04.06
반환값으로 문자열을 반환하는 함수 만들기  (0) 2025.04.05
파일 입출력  (0) 2025.04.03
TCP/IP  (0) 2025.03.31
파일 입출력  (0) 2025.03.28
'C언어' 카테고리의 다른 글
  • 유저찾기
  • 반환값으로 문자열을 반환하는 함수 만들기
  • 파일 입출력
  • TCP/IP
joo_coding
joo_coding
2025.02.18~
  • joo_coding
    주코딩일지
    joo_coding
  • 전체
    오늘
    어제
    • 분류 전체보기 (134) N
      • 일지 (19)
      • 계획표 (7)
      • C언어 (35)
        • 연습장 (12)
      • 과제 (2)
      • C++ (3)
      • python (28)
        • 연습장 (11)
      • TCP IP (4)
      • DB (2)
      • ubuntu (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    c언어 #vscode #gcc #윈도우 #c언어윈도우 #gcc윈도우 #vscode윈도우 #c #c++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
joo_coding
0404 개발일지
상단으로

티스토리툴바