프로그래밍/C,C++

[오류_C/C++] scanf(%d,&a)에 문자를 입력할 경우 컴퓨터는 어떻게 받아들이는가?

gameObject 2023. 6. 2. 11:25
728x90

오류

간단한 예제를 풀던 중 오류가 발생하여 찾아보았다.

 

scanf(%d,&a)에 문자를 입력했더니, 무한으로 출력이 되는것이었다.

 

해당 문제가 발생한 예제는 아래 예제이다.


// 반복문 사용해서 User에게 아무숫자나 입력받기
// 그 숫자가 홀수인지 짝수인지 구별해서 출력하는 프로그램 만들기.

#include <iostream>
#include <stdio.h> 


//반복문 사용해서 User에게 아무숫자나 입력받기
// 그 숫자가 홀수인지 짝수인지 구별해서 출력하는 프로그램 만들기.

int check(int userInput);

int main(){
    int userInput = 1;
    while(1){
        printf("아무숫자나 입력하세요. 홀짝 구분해드릴께요.");
        scanf("%d",&userInput);

        if(userInput == 'q' || userInput == 'Q'){
            return 0;
        }
        check(userInput);
    }
} // main

int check(int userInput){
    int userInput2 = userInput;
    int output;
    output = userInput % 2;
    if(output == 1){
        printf("홀수입니다.\n");
    }else if(output == 0){
        if(userInput2 ==0){
            printf("0입니다.\n");
        }else{
        printf("짝수입니다.\n");
        }
    }else {
        printf("다시입력하세요\n");
    }
    return 0;
}

 

해결방법

검색을 해보니, scanf(%d,&a)에서

%d는 우리가 알듯이 정수형 타입을 변수에 받아서 입력을 하겠다는 의미이다.

 

그런데 문자를 입력할 경우,

나는 아스키 코드로 입력이 될 줄 알았는데 그것이 아니었다.

 

문자를 입력할 경우, 정수형이 아니기때문에 입력자체를 받지 않는다는 것이었다.

입력을 받지 않으면 기존 &a의 변수 a에 들어가있는 쓰레기값이 그대로 남아있기 때문에(즉, 초기화되지 않았기 때문에)

 

계산식이 정확히 이루어 지지 않아서 무한으로 출력이 이루어지는것이었다.

 

다음은 해결코드이다.

 scanf("%d",&userInput);
 scanf("%c",&userInputChar);

이런식으로 scanf를 연속으로 받게되면

A라는 문자를 넣었을때 

1) scanf("%d", &userInput);은 건너뛰게 된다.

2) scanf("%c", &userInputChar);에는 입력이 되게 되어 해당 변수를 이용하여 해결하였다.

 

참고로 한글은 2byte이다.

 

#include <iostream>
#include <stdio.h> 


//반복문 사용해서 User에게 아무숫자나 입력받기
// 그 숫자가 홀수인지 짝수인지 구별해서 출력하는 프로그램 만들기.

int check(int userInput);

int main(){
    int userInput = 1; // 숫자를 위한 변수
    char userInputChar; //문자를 위한 변수
    while(1){
        printf("아무숫자나 입력하세요. 홀짝 구분해드릴께요.\n (나가고 싶다면 Q를 입력하세요)\n");
        scanf("%d",&userInput); //숫자를 입력했을 경우 입력 저장주소
        scanf("%c",&userInputChar); //문자를 입력했을 경우 입력 저장주소

        //탈출 조건 q,Q누르면 탈출
        if(userInputChar == 'q' || userInputChar == 'Q'){
            return 0;
        }
        check(userInput);
    }
} // main

//홀짝 체크 함수
int check(int userInput){
    int userInput2 = userInput;
    int output;
    output = userInput % 2; // 나머지로 홀,짝 판별
    if(output == 1){
        printf("홀수입니다.\n");
    }else if(output == 0){
        if(userInput2 ==0){
            printf("0입니다.\n");
        }else{
        printf("짝수입니다.\n");
        }
    }else {
        printf("다시입력하세요\n");
    }
    return 0;
}
728x90