프로그래밍

 3198, 1/160 회원가입  로그인  
   Opportunity
   이거 왜 경고가 뜨는지알수있을까요? c언어로 만들었습니다

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=6441 [복사]


그냥 제가 처음으로 만들어본 프로그램인 비밀번호 프로그램인데요
회원 분들께 도움을 조금 씩 받아서 해서 솔루션 빌드는 했는데....
한번 시작 해보면 비밀번호 프로그램 입니다
비밀번호를 생성 하시려면 p라고 눌러주시고 아니면 엔터 라는 문장에서 p를 눌렀더니
갑자기 오류 뜨네요 ㅠㅠㅠ
문법이 잘못된건가요?
좀 도와 주세요 ㅠㅠ


#include <stdio.h>

int main(void)
{
        unsigned short right_password;
        char create_key;
    unsigned short  password;
        unsigned short repassword;
        char hidden_key[20];
        
        
        printf("비밀번호 프로그램입니다\n");
        
        printf("비밀번호를 생성하시려면 p라고 눌러주시고 아니면 엔터\n");
    
        scanf("%s", &create_key);
    

        if(create_key=='p')
        
        {printf("생성하실 비밀번호를 입력하세요\n");
            scanf("%d", password);
loop:          
                printf("아까 그 비밀번호를 재입력하세요\n");
                scanf("%d", &repassword);
                
                {if(repassword==password)
                {printf("비밀번호 생성이 성공 하였습니다\n");
                    printf("숨기실 글이나 단어를 입력하세요\n");
                        scanf("%c", &hidden_key);}
                
                else


                        goto loop;}
        }
        
                    


loop2:
            printf("비밀번호를 입력하세요\n");
            
            scanf("%d", &password);
                
                {if(password==repassword)
                        printf("숨겼던 글: %c", hidden_key);
                else
                        goto loop2;}
                

                return 0;
        }

  Hit : 5293     Date : 2014/02/16 03:23



    
yheekeun 2바이트를 담는 unsigend short 로 4바이트인 정수값을 담는 것이 일단 오류가 되겠네요
그리고 도중에 scanf("%d", password);라고 되있는데 &password로 고치셔야됩니다.
또 scanf("%c", &hidden_key) 라고 되있으신데 char hidden_key[20] 으로 하신걸 보니 문자열을 받으실 생각이셨던거 같은데 만약 문자열을 받으시려면 scanf("%s", hidden_key) 로 하는 것이 맞습니다.

scanf에 대해 개념이 정확히 안잡히신거 같아 말씀드리는데
scanf 라는 것은 주소값을 넘겨 받아 그 주소에 값을 넣어주는 함수라고 생각하시면 됩니다.
일반변수 password 는 주소를 의미하는 것이 아니므로 주소지정연산자 & 를 붙여주셔야되고
hidden_key[20] 에서 배열명 hidden_key 는 주소값을 의미하므로 &없이 hidden_key 그대로 써주셔야됩니다.
혹은 scanf("%s", &hidden_key[0]); 이라고 써주셔야됩니다.
왜냐면 hidden_key[0], hidden_key[1], hidden_key[2], 등등은 배열명이 아니므로 주소를 가르키는것이 아니고 변수이기 때문입니다~
더 자세한건 나중에 배열 한번더 보시면서 파악해보세요~

그리고 이대로 해도 오류가 나는게 scanf 에서 서식문자 %c %d 에 의미에 있는데
%c는 문자, %d는 정수를 받습니다. %d는 1(enter) 입력하게되면 정수형인 1만 저장되고 enter(문자형)는 저장이 안된상태로 입력버퍼에 남아 있게 되는데 다음 scanf("%c", hidden_key) 이부분에서 enter라는 문자형을 입력받게 되요. 그럼 자신에 의도랑은 상관없이 hidden_key 에는 엔터가 입력되고 비밀번호를 입력하라는 문구가 뜰거에요~
fflush(); 라는 함수로 입력버퍼를 비워주셔야 됩니다.

위에 개념들은 상당히 중요한 개념들인데 천천히 시간들여가며 이해하시길 바랄께요
2014/02/16  
MainThread 음 일단 문자열과 포인터, %d,%c,%s가 버퍼에서 어떻게 데이터를 꺼내오는지 등 기본기부터 공부하셔야 될거 같아요

1. password에 &연산자 필요
2. hidden_key는 문자열 이름-> 포인터 &필요없음
3, 숨겼던 글 : %s -> 문자열 출력하려고 하는 거니까

From MainThread
2014/05/24