scanf 함수에 대해서 공부를 하다가 재미있는 사실을 알아냈다.
1. scanf 함수의 오류 - 1(char타입)
scanf 함수를 사용해서 변수에 값을 입력하는 것에 대해서 배우면서
scanf 함수를 사용해서 변수를 입력할때
char 타입의 경우는 맨 앞에 입력하지 않으면
오류가 생겨서 입력이 제대로 되지 않는다고 배웠다.
ex)
#include<stdio.h>
int main(void)
{
int num1, num2;
char ch;
printf("정수 2개와 문자 1개 입력\n\n");
printf("정수1 : ");
scanf("%d", &num1);
printf("정수2 : ");
scanf("%d", &num2);
printf("문자 : ");
scanf("%c", &ch);
printf("\n\n======== 결과 ========\n\n");
printf("정수1 : % d\n정수2 : % d\n문자 : % c\n", num1, num2, ch);
return 0;
}
이런 코드를 작성했다고 했을 때
나는 정수1, 2, 문자를 차례로 입력하고 결과가 나오는 것을 기대했었다.
하지만 결과는
이렇게 문자를 넘어가 버린다...
원인은 char타입의 형식문자인 %c가
enter : \n, tab : \t 등도 문자로 인식해서 생기는 오류라고 한다.
그래서 변수를 여러개 입력할 때는 char타입을 맨 앞에 입력해야한다고 하는데
그때 든 생각이
"char 타입을 맨 앞에 입력하지 못하는 상황도 분명히 있을 것 같은데
그럴때는 어떻게 하지?" 였다.
2. scanf 함수의 오류 - 2 (맨 뒤 공백)
따로 책과 유튜브로 추가적으로 공부를 하고 있던 와중에
scanf 함수의 형식문자 맨 뒤에는 space(띄어쓰기)를 넣을 수 없다는 사실을 알았다.
형식문자의 사이에는 넣어도 되지만, 맨뒤에 넣으면 안된다는 것이다.
정확히 왜 그런 문제가 있는지는 아직 모르겠지만
다른 값을 넣기 전에는 명령어가 넘어가지 않는다고 한다.
ex)
#include<stdio.h>
int main(void)
{
int num1, num2;
printf("정수 2개 입력\n\n");
printf("정수1 : ");
scanf("%d", &num1);
printf("정수2 : ");
scanf("%d ", &num2);
printf("\n\n======== 결과 ========\n\n");
printf("정수1 : % d\n정수2 : % d\n", num1, num2);
return 0;
}
위 코드에서 보면 정수2를 입력하는 scanf의 형식문자 맨 뒤에 공백이 한칸 있는 것을 알 수 있는데
이렇게 코드를 실행하면
enter, space, tab 뭘 해도 결과가 출력되지 않는다.
하지만 이때 다른 값을 아무거나 입력하면
이제서야 결과가 출력되는 것을 볼 수 있다.
3. 오류 x 오류 = 정상??
이 두개의 오류를 합체한다
나는 여기에서
"뒤에 입력하는 값을 이 코드가 값으로 받아들이기는 하는 걸까??"
라는 의문이 들어서
다시 첫번째 코드에서
정수2의 형식문자(%d) 뒤에 공백 하나만 추가하고 실행해보았다.
#include<stdio.h>
int main(void)
{
int num1, num2;
char ch;
printf("정수 2개와 문자 1개 입력\n\n");
printf("정수1 : ");
scanf("%d", &num1);
printf("정수2 : ");
scanf("%d ", &num2);
printf("문자 : ");
scanf("%c", &ch);
printf("\n\n======== 결과 ========\n\n");
printf("정수1 : % d\n정수2 : % d\n문자 : % c\n", num1, num2, ch);
return 0;
}
printf가 원하는 위치에서 출력되지는 않았지만
결과는 제대로 출력이 되었다.
변수에 제대로 값이 들어갔다는 뜻이다.
그러면 아래의 코드와 같이는 할 수 있다는 것을 알아냈다.
#include<stdio.h>
int main(void)
{
int num1, num2;
char ch;
printf("정수 2개와 문자 1개를 차례대로 입력\n\n");
scanf("%d %d ", &num1, &num2);
scanf("%c", &ch);
printf("\n\n======== 결과 ========\n\n");
printf("정수1 : % d\n정수2 : % d\n문자 : % c\n", num1, num2, ch);
return 0;
}
여기까지 scanf의 오류들을 가지고
정상적으로 작동하는 것 처럼 보이는 코드를 만들어보는 실험을 해보았다.
+) 추가 실험
근데 위에처럼 입력할 때 printf가 먼저 나왔으면 해서
하나 더 확인해 봤다.
문자형 형식문자 앞에 공백을 넣으면
printf가 먼저 실행되고 제어문자는 무시된 다음에 값이 입력되서
가장 이상적으로 결과가 나올 수 있지 않을까??
#include<stdio.h>
int main(void)
{
int num1, num2;
char ch;
printf("정수 2개와 문자 1개 입력\n\n");
printf("정수1 : ");
scanf("%d", &num1);
printf("정수2 : ");
scanf("%d", &num2);
printf("문자 : ");
scanf(" %c", &ch);
printf("\n\n======== 결과 ========\n\n");
printf("정수1 : % d\n정수2 : % d\n문자 : % c\n", num1, num2, ch);
return 0;
}
(scanf에서 int타입을 입력하는 정수형 형식문자(%d)는 공백 없이 제대로 작성하고, 문자형을 입력하는 %c 앞에만 공백을 넣는다.)
드디어 내가 처음 생각했던대로 실행이 되었다...
(이렇게 해도 되나 모르겠지만..ㅎ)
ps. 참고로 문자형(%c)가 아니라 문자열(%s)로 작성하면 이런거 안해도 잘 동작함.
아무튼 끝.
'프로그래밍 공부 > C│C++│C#' 카테고리의 다른 글
[C언어] 복습노트 - 2 | 자료형과 변수, 상수 (0) | 2025.03.30 |
---|---|
[C언어] 복습노트 - 1 | C언어의 특징 (0) | 2025.03.30 |
[C언어](오류) _CRT_SECURE_NO_WARNINGS (3) | 2025.01.05 |
[C언어] stdio.h? 헤더파일? 그게뭔데... (0) | 2024.12.27 |