[C언어](코드실험) scanf 맨 뒤에 space로 끝내면?

반응형

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)로 작성하면 이런거 안해도 잘 동작함.

 

 

아무튼 끝.

반응형