본문 바로가기
Study (etc)/C

[문자열 함수] 알파벳 대소문자 변환

by Haren 2019. 2. 10.

오늘은 문자와 문자열 함수를 공부하던 도중 제시된 예제를 작성해보았다.


입력과 출력에는 '스트림 (stream)'이라는 매개체가 다리의 역할을 해준다. 스트림에는 입력 스트림과 출력 스트림 두 가지가 있다.

스트림은 OS가 제공하는 가상의 다리이며 외부장치와 프로그램과의 데이터 송수신의 도구인 셈이다.

콘솔 (일반적으로 키보드 및 모니터) 입출력을 위한 스트림은 프로그램 실행 시 자동으로 생성되었다가 종료 시 자동으로 소멸된다.



표준 스트림에는 세 가지가 존재한다.


■stdin - 표준 입력 스트림


■stdout - 표준 출력 스트림


■stderr - 표준 에러 스트림



흔히 사용하는 출력 함수 printf와 입력 함수 scanf는 표준 스트림을 사용한다.


이번에는 문자 단위의 입출력 함수를 이용해보고자 한다.


문자 단위 출력 함수로는 putcharfputc가 있다.


함수 호출에 성공할 경우 쓰여진 문자정보가 출력되며, 실패할 경우 EOF를 반환한다.

putchar는 stdout으로 표현되는 표준 출력 스트림으로 데이터를 전송하며, fputc는 출력 스트림을 지정할 수 있으며 stdout으로 전송할 경우 putchar와 같아진다.


문자 단위 입력 함수로는 getcharfgets가 있다.


파일의 끝에 도달하거나 함수호출에 실패한 경우 EOF를 반환한다.

getchar는 stdin으로 표현되는 표준 입력 스트림으로 데이터를 입력 받으며, fgets는 fputc와 마찬가지로 입력 스트림을 지정할 수 있고, stdin으로 입력을 받을 경우 getchar와 동일한 함수로 볼 수 있다.


EOF란 윈도우에서는 Ctrl + Z, 리눅스에서는 Ctrl+D키가 입력된 경우를 말한다.



이 문자 단위 입출력 함수를 이용한 예제이다.


문제 21-1

프로그램 사용자로부터 알파벳 문자를 하나 입력 받아서, 입력 받은 문자가 대문자면 이를 소문자로 변환해서 출력해주고, 입력 받은 문자가 소문자면 이를 대문자로 변환해서 출력해주는 프로그램을 작성해보자. 단, 문자의 입출력에는 getchar 함수와 putchar 함수를 사용하기로 하자. 그리고 프로그램 사용자가 알파벳 이외의 문자를 입력하는 경우에는 그에 따른 오류 메시지를 간단히 출력하기로 하자.



조건

■대문자 (ASCII 65~90) < - > 소문자 (ASCII 97~122)

■문자의 입출력에는 getchar 함수와 putchar 함수 이용.

■알파벳 이외의 문자 입력시 오류 메시지 출력



대문자와 소문자의 ASCII 값을 보면 모두 32 차이가 나는 것을 알 수 있다. 즉, 대문자 A (65)를 소문자 a (97)로 바꾸기 위해서는 32를 더하면 된다.

반대로 소문자를 대문자로 만들 경우 32를 빼주면 된다.


대소문자를 바꾸는 것을 함수로 따로 만들어 구현해보도록 하겠다.



소스코드

#include <stdio.h>


int Change_Alphabet(int ch) //알파벳 대소문자 변경 함수
{
    if(ch>='A'&&ch<='Z')
        return ch+32;
    else if(ch>='a'&&ch<='z')
        return ch-32;
    else
        return -1;
}
int main()
{
    char ch;
    
    puts("알파벳 입력 : ");
    ch=getchar(); //알파벳 입력
    ch=Change_Alphabet(ch);
    
    if(ch==-1)
    {
        printf("알파벳을 입력해주세요!\n");
        return -1;
    }
    
    putchar(ch);
    printf("\n");
    
    return 0;
}



실행 결과

순서대로 대문자, 소문자, 알파벳이 아닌 문자의 입력 결과이다.


아직 블로그에는 포스팅하지는 않았지만 최근 윈도우를 사용하던 삼성 아티브북 5에서 애플의 맥북 프로 터치바로 장비를 변경했기에 32비트 윈도우 콘솔이 아닌 GCC 컴파일러를 설치하여 Xcode에서 코딩하고 결과를 확인하고 있다.

이에 대해서는 조만간 포스팅을 통해 다루기로 하겠다.