C/C++ Switch Case 문에서 Break가 필요한 이유
기본 문법은 자꾸 안쓰면 잊어버린다...
문제
오늘 C/C++ 공부를 하다가 연습문제 하나를 푸는데, 표준입력으로 주어지는 정수와 문자열을 처리하는 문제였다. 다만 주어지는 정수를 서수로 표현하여 문자열로 다시 출력해주어야 했는데, 이때 if
문으로 처리하지 않고 switch case
문으로 처리하고자 했다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int number;
char name[31], result[40];
scanf("%d\n", &number);
scanf("%s", name);
switch(number)
{
case 1 :
sprintf(result, "%dst %s", number, name);
case 2 :
sprintf(result, "%dnd %s", number, name);
case 3 :
sprintf(result, "%drd %s", number, name);
default :
sprintf(result, "%dth %s", number, name);
}
printf("%s\n", result);
return 0;
}
문제 발생 원인
코드에 따르면 표준입력으로 1부터 3까지 정수가 들어오면 각 숫자에 맞는 서수 표현자가 출력되어야 하는데 계속 1th case
와 같이 표현되었다. 이유가 뭔지 한참 찾아보다가 break
문을 넣어주지 않았다는 것을 깨달았다. C/C++는 case
분기가 일어날 때마다 마지막에 break
를 넣어주어야 각 case에서 코드가 종료되기 때문이다.
이걸 "Falling through"라고도 부른다던데, 정말 잠깐 C를 안했더니 금세 까먹었다..ㅠㅠ 앞으로는 같은 실수 하지 않도록 해야겠다.
정답 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int number;
char name[31], result[40];
scanf("%d\n", &number);
scanf("%s", name);
switch(number)
{
case 1 :
sprintf(result, "%dst %s", number, name); break;
case 2 :
sprintf(result, "%dnd %s", number, name); break;
case 3 :
sprintf(result, "%drd %s", number, name); break;
default :
sprintf(result, "%dth %s", number, name); break;
}
printf("%s\n", result);
return 0;
}