인프런 커뮤니티 질문&답변

오의현님의 프로필 이미지
오의현

작성한 질문수

C언어 대문자 <-> 소문자 변환 함수

해결된 질문

작성

·

622

0

#include <stdio.h>

 

 

int main()

{

int ch;

 

while (1)

{

ch = getchar();

if ('A' <= ch && ch <= 'Z')

{

ch = ch + 32;

putchar(ch);

}

else if ('a' <= ch && ch < 'z')

{

ch = ch - 32;

putchar(ch);

}

else printf("범위를 벗어난 입력입니다.");

}

return 0;

}

 

이렇게 함수를 구성해보았습니다.

입력받은 문자를 ch에 저장하고, 저장된 문자의 아스키코드가 알파벳 대문자의 범위(65~90)에 속한다면

아스키코드값에 +32를 해주어 소문자로 변환을 하고

반대로 저장된 문자의 아스키코드가 알파벳 소문자의 범위(97~122)에 속한다면 아스키코드값에 -32를 해주어 

대문자로 변경을 하는 방식입니다.

 

그리고 만약, 알파벳 대문자의 범위나 소문자의 범위에도 속하지 않는 기타 문자가 저장된다면

오류메세지를 출력하게끔 구성을 하였습니다.

 

실제로 컴파일을 해보면 대문자는 소문자로 소문자는 대문자로 정상적으로 변환이 되지만

마지막 else에 있는 printf 함수가 ch에 저장된 값에 상관 없이 아래 사진과 같이 지속적으로 함께 실행이 됩니다.

 

어느 부분에서 문제가 발생한 걸까요ㅠ.ㅠ

답변 1

0

getchar() 함수가 알파벳 입력 후 엔터를 칠때의 개행문자 (\n) 까지도 입력 버퍼에 남아있어서 생기는 문제입니다.

a를 입력하고 엔터를 누르면 버퍼에 'a' 와 '\n' 이 들어가서, 각각에 대한 while문이 돌고있어서 의도대로의 A가 나온 후 \n에 대한 while문이 else에 걸려 메시지를 출력하고 있습니다.

좋은 프로그래밍은 아니지만 getchar() 로 ch 에 저장하고 난 다음 코드에 getchar()을 또 사용하여 입력버퍼를 비울 수도 있고,

 

while {
    ch = getchar();
    getchar();
    ....
}

while문이 종료되기 직전에 while(getchar() != '\n'); 코드를 추가하여 입력버퍼를 비우는 방법도 있습니다.

 

while {
    ....
    while(getchar() != '\n');
}
오의현님의 프로필 이미지
오의현
질문자

아하 정말 잘 이해가 되었습니다 감사합니다!

오의현님의 프로필 이미지
오의현

작성한 질문수

질문하기