윤성우의 열혈 C 프로그래밍 - getchar 함수와 putchar 함수 활용 [21-1]

Yumin Jung·2023년 9월 24일
0

21-1-1

아스키코드를 구성하는 값의 범위는 0이상 127이하이다.
알파벳 대문자와 소문자간의 값의 차는 32이다 (A는 65 / a는 97)
이 특성을 이용하여 문제에 접근해보았다.

#include <stdio.h>

int main(void) {

	int ch = getchar();

	if (65 <= ch <= 90)
		putchar(ch + 32);
	else if (97 <= ch <= 122)
		putchar(ch - 32);
	else
		printf("잘못입력하였습니다");
}

if문에 문제가 있는가? A(65)을 입력했을때는 a(97)가 입력되었지만, a(97)을 입력했을때는 A(65)가 입력되었지 않았다.
왜 문제가 되는지 몰라서 putchar(ch+32) 라고 검색해보았다. 역시나, 나와 비슷하게 의문을 가지고 있는 사람들이 있었다.

결론은 if문의 조건이 잘못되었다.
<= 연산자는 왼쪽에서 오른쪽으로 연산이 진행되므로, 'a' <= ch 가 먼저 연산이 된 후, 이 expressions 의 값이 1 이기 때문에 ( 'a' <= ch <= 'z' ) 는 ( 1 <= 'z' ) 가 된다.

	if ( (원래 65 <= ch) 1 <= 90)
		putchar(ch + 32);
	else if ((원래 97 <= ch) 1 <= 122)
		putchar(ch - 32);

위 코드와 같이 해석되어 문제를 일으킨 것이다.


아래는 정답인 코드이다.

#include <stdio.h>

int main(void) {

	int ch = getchar();

	if (65 <= ch && ch <= 90)
		putchar(ch + 32);
	else if (97 <= ch && ch <= 122)
		putchar(ch - 32);
	else
		printf("잘못입력하였습니다");
}

'a' <= ch <= 'z' 는 결국 조건이 두 개이므로, 컴퓨터에게 두 개의 조건을 만족시킬 때 if 문을 실행하라고 지시하기 위해서는 개별 조건을 논리연산자로 묶어서 코드를 짜야 한다.

profile
문과를 정말로 존중해

0개의 댓글