홈 > IT > IT정보
IT정보

C언어 함수, 포인터, 동적할당 문제풀기 4-23

3 realdragonhead 0 256 0 0

윈도우에는 개발자의 편의를 위한 conio.h 헤더파일이 있어 getch() 함수를 사용가능하지만 리눅스는 없기 때문에 인터넷에서 참고하여 getch() 를 만들어 썼습니다. 또는 getchar에서 echo 기능을 끄는 방법도 있지만 직접 만들어서 쓰는 방법으로 풀었습니다.


4-23. 키보드로 패스워드를 입력받는 함수를 작성하시오. 즉 키보드로 입력받은 문자들을 문자열에 저장하고 그 문자열을 반환하는 함수를 작성하시오. 단, 입력된 문자는 알려지지 않게 '*'로 표시하시오. main() 함수에서 이 함수를 호출하여 결과를 출력하시오.

<CODE>

#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define size 10


int getch(void);
void pwinputer(char * );
void main() {
        char * usrpw = (char *)malloc(sizeof(char)*size);


        puts("password 를 입력 받습니다. 입력 받을 때는 '*'로 표시됩니다.");
        fputs("passwd : ", stdout);
        pwinputer(usrpw);
        printf("\nresult : %s\n", usrpw);
}


void pwinputer(char * finput) {
        char temp;
        int count =0;


        while(1) {
                if(count == size) {
                        finput[count-1] = '\0';
                        while(getch()!='\n');
                        break;
                }


                temp = getch();


                if(temp == '\n') {
                        finput[count] = '\0';
                        break;
                }
                finput[count] = temp;
                putchar('*');
                count++;
        }
}


int getch(void) {
        struct termios oldt, newt;
        int ch;
        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON | ECHO);
        tcsetattr(STDIN_FILENO, TCSANOW, &newt);
        ch = getchar();
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
        return ch;
}


<RESULT>

[case 1]

password 를 입력 받습니다. 입력 받을 때는 '*'로 표시됩니다.

passwd : *****

result : hello

[case 2]

password 를 입력 받습니다. 입력 받을 때는 '*'로 표시됩니다.

passwd :

result :

[case 3]

password 를 입력 받습니다. 입력 받을 때는 '*'로 표시됩니다.

passwd : **********

result : aaaaaaaaa


4-23A. 4-23의 함수에서 패스워드 입력 중 <Back Space>를 입력하면 직전에 입력한 하나의 문자를 삭제하도록 수정하시오.

<CODE>

#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define size 10


int getch(void);
void pwinputer(char * );
void main() {
        char * usrpw = (char *)malloc(sizeof(char)*size);


        puts("password 를 입력 받습니다. 입력 받을 때는 '*'로 표시됩니다.");
        fputs("passwd : ", stdout);
        pwinputer(usrpw);
        printf("\nresult : %s\n", usrpw);
}


void pwinputer(char * finput) {
        char temp;
        int count =0;


        while(1) {
                if(count == size) {
                        finput[count-1] = '\0';
                        while(getch()!='\n');
                        break;
                }
                temp = getch();
                if(count!=0 && temp == 127) {
                        printf("\b");
                        fputs(" ",stdout);
                        count--;
                        continue;
                }
                if(count==0 && temp == 127) {
                        continue;
                }
                if(temp == '\n') {
                        finput[count] = '\0';
                        break;
                }
                finput[count] = temp;
                putchar('*');
                count++;
        }
}


int getch(void) {
        struct termios oldt, newt;
        int ch;
        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON | ECHO);
        tcsetattr(STDIN_FILENO, TCSANOW, &newt);
        ch = getchar();
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
        return ch;
}


<RESULT>

[case 1]

password 를 입력 받습니다. 입력 받을 때는 '*'로 표시됩니다.

passwd : **** ****

result : 12341234

[case 2]

password 를 입력 받습니다. 입력 받을 때는 '*'로 표시됩니다.

passwd : **********

result : 111111111

[case 3]

dragonhead@dm1518247598151:~/Cprogrammingexam/4$ ./4-23A

password 를 입력 받습니다. 입력 받을 때는 '*'로 표시됩니다.

passwd : **********

result : helomynam


4-23B. ID와 패스워드가 저장되어 있는 DB 중에서 입력받은 ID가 존재하고 패스워드가 일치하는지 검사하는 함수를 작성하시오. ID와 패스워드는 초기화하여 사용하고, main() 함수에서 이 함수를 호출하여 결과를 확인한다.

(Hint) char DB[][2][MAX] = {"id1", "pw1", "id2", "pw2", "id3", "pw3", ""};

<CODE>

#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 20
#define index 3


char DB[index][2][size] = {"realdragonhead", "dragonegg", "dragonnest", "dragon!", "fakedragonhead", "snakeegg"};


int getch(void);
void idinputer(char * );
void pwinputer(char * );
void usercompare(char * , char * );
void main() {
        char * usrid = (char * )malloc(sizeof(char)*size);
        char * usrpw = (char * )malloc(sizeof(char)*size);


        puts("id 와 password 를 입력 받습니다. password 입력 받을 때는 '*'로 표시됩니다.");
        fputs("id : " ,stdout);
        idinputer(usrid);


        fputs("passwd : ", stdout);
        pwinputer(usrpw);
        puts("");
        usercompare(usrid, usrpw);
}


void idinputer(char * uinput) {
        char utemp;
        int ucount=0;


        while(1) {
                if(ucount==size) {
                        uinput[ucount-1] = '\0';
                        while(getch()!='\n');
                        break;
                }


                utemp = getchar();


                if(utemp=='\n') {
                        uinput[ucount] = '\0';
                        break;
                }


                uinput[ucount] = utemp;
                ucount++;
        }
}


void pwinputer(char * finput) {
        char temp;
        int count =0;


        while(1) {
                if(count == size) {
                        finput[count-1] = '\0';
                        while(getch()!='\n');
                        break;
                }
                temp = getch();
                if(count!=0 && temp == 127) {
                        printf("\b");
                        fputs(" ",stdout);
                        count--;
                        continue;
                }
                if(count==0 && temp == 127) {
                        continue;
                }
                if(temp == '\n') {
                        finput[count] = '\0';
                        break;
                }
                finput[count] = temp;
                putchar('*');
                count++;
        }
}


int getch(void) {
        struct termios oldt, newt;
        int ch;
        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON | ECHO);
        tcsetattr(STDIN_FILENO, TCSANOW, &newt);
        ch = getchar();
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
        return ch;
}


void usercompare(char * idinput, char * pwinput) {
        int idindex = 0, idcorrect=1;


        while(idindex < index) {
                if(strcmp(idinput, DB[idindex][0])==0)
                        break;
                idindex++;
        }
        if(idindex==index) {
                puts("존재하지 않는 계정입니다.");
                return ;
        }        if(strcmp(pwinput,DB[idindex][1])==0) {                printf("%s 계정 로그인이 성공하였습니다.\n", DB[idindex][0]);        }        else {                puts("올바르지 않은 비밀번호 입니다.");                return ;        }}


<RESULT>

[case 1]

id 와 password 를 입력 받습니다. password 입력 받을 때는 '*'로 표시됩니다.

id : hello

passwd : *****

존재하지 않는 계정입니다.

[case 2]

id 와 password 를 입력 받습니다. password 입력 받을 때는 '*'로 표시됩니다.

id : realdragonhead

passwd : *

올바르지 않은 비밀번호 입니다.

[case 3]

id 와 password 를 입력 받습니다. password 입력 받을 때는 '*'로 표시됩니다.

id : aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

passwd : ********************

존재하지 않는 계정입니다.

[case 4]

id 와 password 를 입력 받습니다. password 입력 받을 때는 '*'로 표시됩니다.

id : realdragonhead

passwd : *********

realdragonhead 계정 로그인이 성공하였습니다.

[case 5]

id 와 password 를 입력 받습니다. password 입력 받을 때는 '*'로 표시됩니다.

id : fakedragonhead

passwd : ********

fakedragonhead 계정 로그인이 성공하였습니다.


0 Comments
Category
State
  • 현재 접속자 51 명
  • 오늘 방문자 590 명
  • 어제 방문자 601 명
  • 최대 방문자 948 명
  • 전체 방문자 163,940 명
  • 전체 게시물 1,862 개
  • 전체 댓글수 249 개
  • 전체 회원수 113 명
Facebook Twitter GooglePlus KakaoStory NaverBand
PlusFriend Chat