[C언어-기초실습-9] 입력 된 문자열을 대소문자로 변환하기

in #kr-dev5 years ago (edited)

[C언어-기초실습-9] 입력 된 문자열을 대소문자로 변환하기



오늘은 문자열 놀이로 대소문자를 서로 교차 변환을 하는 실습을 하도록 하겠습니다. 대소문자 변환을 알기 위해서는 알파벳의 아스키코드 값을 알아야 하는데 지난시간에 다룬 내용을 기반으로 실습을 하겠습니다.

1. 문제의 이해


알파벳의 아스키코드값의 범위는다음과 같습니다.

//기본값 
printf("%d %d \n",'a','z');
printf("%d %d \n",'A','Z');
printf("%d %d \n",'a'-'A','z'-'Z');

A ~ Z : 65~90
a ~ z : 97~122
'a' - 'A' = 32
'z' - 'Z' = 32
[결과]
a1.jpg

'a'에서 'A'까지의 간격은 32이니다. 그래서 'A'라는 대문자를 'a'라는 소문자를 출력하고 싶을 때 다음과 같이 코딩을 합니다.

'a' - 32

여기서 반대로 'a'라는 소문자를 'A'라는 대문자로 출력하고 싶을 때 반대로 하면 됩니다.

'A'+32

이렇게 표현하면 됩니다.

그러면 입력된 문자가 대문자면 소문자로 변경하고 소문자면 대문자로 변경 하려면 아래와 같이 코딩을 하면 됩니다.

char inputCh;

scanf("%c",&inputCh);
if(inputCh>='a' && inputCh<='z') inputCh=inputCh-32;
else if(inputCh>='A' && inputCh<='Z') inputCh=inputCh+32;
    
printf("%c \n",inputCh);

if문으로 알파벳 범위 'a'에서 'z'까지의 범위 안에 알파벳이 들어 간다면 32을 빼주면 대문자로 바뀌고 다음 if문으로 'A'에서 'Z'까지의 범위 안에 알파벳이 들어 간다면 32을 더해주면 소문자로 바뀌게 설정하면 됩니다.

32만큼 더해주거나 빼줌으로 해당 알파벳에 맞게 대소문자로 서로 변경이 되는 것이죠.

[결과]
a2.jpg

여기서 하나의 입력 알파벳을 대소문자로 변경을 했으니 문자열 안에 대소문자를 변환하는 능력을 키워 볼까요.

문자열 대소문자 반전


[조건 문자열]
aBa -> AbA

이렇게 바꾸려고 한다면 어떻게 해야 할까요. 문자열이니 각 알파벳을 비교한다 배열이고 배열이면 루프문을 떠올리고 그러면 자연스럽게 for문이 머리속에서 떠올려야 합니다.

scanf("%s",inputStr);
len=strlen(inputStr);

//처리 대문자를 소문자로 소문자를 대문자로 변환     
for(i=0;i<len;i++){     
    if(inputStr[i]>='a' && inputStr[i]<='z') inputStr[i]=inputStr[i]-32;
    else if(inputStr[i]>='A' && inputStr[i]<='Z') inputStr[i]=inputStr[i]+32;
    else printf("Error! \n");
}

[결과]
a3.jpg

대소문자가 들어 있는 문자열을 일괄적으로 대문자 or 소문자로 변환


이제는 대소문자가 섞여 있는 문자열을 일괄적으로 바꾸는 코딩은 어떻게 할까요. 대소문자 반전 코딩에서 두개의 if문으로 해서 체크를 했습니다. 여기에서는 한개의 if문으로 대문자일 때만 반전 시키거나 소문자 일때만 반전 시키면 해결 됩니다.

소문자 경우 : 문자열 안에 소문자일 때만 대문자로 변경

for(i=0;i<len;i++){     
    if(inputStr[i]>='a' && inputStr[i]<='z') inputStr[i]=inputStr[i]-32;        
}

대문자 경우 : 문자열 안에 대문자일 때만 소문자로 변경

for(i=0;i<len;i++){     
    if(inputStr[i]>='A' && inputStr[i]<='Z') inputStr[i]=inputStr[i]+32;        
}

이렇게 해서 대소문자를 원하는 형태로 변환하는 방법을 배웠습니다. 이제 코딩으로 전체 내용을 방금한 문자열 내용들을 코딩해보도록 하죠.

2. 코딩


문자열을 대소문자로 바꾸는데 위 설명한 코딩에서 약간 수정하여 코딩합니다.

[조건]

  • 대소문자열을 대문자는 소문자로 소문자는 대문자로 변환
  • 대소문자열을 일괄적으로 대문자로 변환
  • 대소문자열을 일괄적으로 소문자로 변환

[전체소스]

#include <stdio.h>
#include <Windows.h>

int main(int argc, char *argv[]) {

    int i;  
    int len;
    char inputStr[10];
    //char inputCh;
    
    /*한글자 변환 
    scanf("%c",&inputCh);
    if(inputCh>='a' && inputCh<='z') inputCh=inputCh-32;
    else if(inputCh>='A' && inputCh<='Z') inputCh=inputCh+32;
    
    printf("%c \n",inputCh);
    */
    
    //입력 
    printf("알파벳 문자열을 입력하시오? ");
    scanf("%s",inputStr);
    len=strlen(inputStr);
    
    //처리 대문자를 소문자로 소문자를 대문자로 변환     
    for(i=0;i<len;i++){     
        if(inputStr[i]>='a' && inputStr[i]<='z') printf("%c",inputStr[i]-32);
        else if(inputStr[i]>='A' && inputStr[i]<='Z') printf("%c",inputStr[i]+32);
        else printf("Error! \n");
    }
    printf("\n");
    
    //처리 문자열 안에 소문자를 대문자로 변환    
    for(i=0;i<len;i++){     
        if(inputStr[i]>='a' && inputStr[i]<='z') printf("%c",inputStr[i]-32);
        else printf("%c",inputStr[i]);
    }
    printf("\n");
    
    //처리 문자열 안에 대문자를 소문자로 변환    
    for(i=0;i<len;i++){     
        if(inputStr[i]>='A' && inputStr[i]<='Z') printf("%c",inputStr[i]+32);
        else printf("%c",inputStr[i]);
    }
    printf("\n");
    
    system("pause");
    return 0;   
}

세가지 조건의 출력을 만들기 위해서 위에서 설명한 내요을 약간 수정했습니다. 기본 내용은 이 소스에 그대로 적용했으니깐 잘 소스를 분석하기 바래요.

[결과]
aa1.jpg

마무리


지난 시간에 랜덤 알파벳 놀이를 했었는데 알파벳 변환 방법도 실습하면 좋을 것 같아서 post로 작성했네요. 오늘의 핵심은 알파벳 글자의 아스키코드값과 대소문자의 알파벳 간격 32라는 원리를 이용하여 알파벳을 변환 시키는 내용입니다. 이 원리를 이해하시면 기초 암호문도 만들 수 있습니다. 예전에 고전 암호화 post를 작성한 적이 있는데 언제 post로 작성햇는지 기억이 잘 안나지만 아무튼 암호학 개론이라고 검색하시고 고전 암호화 알고리즘을 찾으시면 알파벳 암호문을 만드는 기초 암호 알고리즘이 있는데 찾아서 코딩 해보세요.


Sponsored ( Powered by dclick )

dclick-imagead

Sort:  

안녕하세요 codingman님

랜덤 보팅!!

소소하게 보팅하고 가요

Turtle-lv1.gif

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.033
BTC 63924.41
ETH 3120.23
USDT 1.00
SBD 3.88