Coding & Programming/C, C++

[C/C++] ASCII 코드값을 이용하여 문자열 내 알파벳, 대소문자, 공백, 숫자 식별(분류)하기 + 대소문자 변환하기

mainCodes 2021. 4. 12. 10:21

[C/C++] ASCII 값을 이용하여 문자열 내 알파벳, 대소문자, 공백, 숫자 식별(분류)하기 + 대소문자 변환하기

 

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

 

C/C++에서 char 자료형의 문자 변수는 0에서 127 사이의 정수 값을 저장할 수 있습니다. 이는 미국 ANSI(American Standard Code for Information Interchange)에서 표준화한 정보교환용 7비트 부호체계인 ASCII 코드에 해당되며 영문 키보드로 입력할 수있는 모든 기호들이 할당되어 있어 있습니다.

 

※ ASCII 코드에 대한 자세한 설명은 위키백과를 참고해 주세요. 

 

아래 표와 같이 ASCII 코드값에는 십진수(Dec.)기준으로 숫자(0~9)가 48번에서 57번에 할당되어 있고, 알파벳 대문자(A~Z)는 65번~90번, 소문자(a~z)는 97번에서 122번에 할당되어 있습니다. 

 

출처 : http://www.lookuptables.com(www.asciitable.com/)

 

만약 사용자가 입력한 문자의 ASCII 코드 값이 0~9이면 숫자, 65~90이면 알파벳 대문자, 97~122이면 알파벳 소문자에 해당됩니다. 문자형(char) 이므로 '0', '1', a', 'b'와 같이 작은 따옴표를 이용하여 값을 변수에 저장할 수 있는데 컴퓨터 내부적으로 ASCII 코드 테이블을 참고하여 48, 49, 97, 98의 값으로 처리 합니다.

 

예제로 표현하면 보다 쉽게 정리가 됩니다. 아래 예제는 char형 변수 a1~a4에 각각  한 문자씩 '0', '1', 'a', 'b'를 대입하고 출력한 결과와 동일한 변수 a1~a4에 각각 48, 49, 97, 98의 ASCII 코드 테이블상에 있는 번호를 대입한 결과를 비교합니다. 실행결과 동일한 결과가 출력되는데 이는 컴퓨터가 ASCII 코드 체계를 사용하기 때문입니다.

#include <stdio.h>

int main()
{
    char a1 = '0';
    char a2 = '1';
    char a3 = 'a';
    char a4 = 'b';


    printf("a1 = %c\n", a1);
    printf("a2 = %c\n", a2);
    printf("a3 = %c\n", a3);
    printf("a4 = %c\n", a4);

    a1 = 48;
    a2 = 49;
    a3 = 97;
    a4 = 98;

    printf("\n");
    printf("a1 = %c\n", a1);
    printf("a2 = %c\n", a2);
    printf("a3 = %c\n", a3);
    printf("a4 = %c\n", a4);
}

 

실행결과(Output):

 

 

아래 그림은 Visual Studio 2019에서 a1~a4까지의 변수값을 Watch한 내용입니다. Value 컬럼을 보면 48 '0', 49 '1', 97 'a', 98 'b'의 값들이 보일텐데요. 대입은 각각 '0', '1', a', 'b' 형태로 했지만 내부적으로 ASCII 코드 값도 함께 보여주고 있습니다.

 

 

다시 본론으로 돌아가서,

 

C/C++ 언어는 사용자가 입력된 문자가 알파벳인지, 숫자인지, 공백인지를 식별해주는 isalnum(), isalpha(), isupper(), isdigit() 등의 라이브러리 함수를 지원합니다. 이런 라이브러리 함수를 사용하면 아주 편리하게 사용자가 입력한 문자의 유형을 구분할 수 있습니다.

 

이 부분은 나중에 정리 하기로 하고, 우선은 ASCII 코드 값에 대한 이해가 필요할 것 같아 ASCII 코드 체계를 이용한 알파벳 대소문자, 숫자, 공백 등을 식별하는 방법을 먼저 기록합니다.

 

ASCII 코드값을 이용한 알파벳 대소문자, 숫자, 공백 등 식별하기 예제(Example):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <string.h>
 
int main() 
{
    char input[50= "";
    char c;
 
    printf("문자열을 입력하세요(예;\"Hello World! 123AbcDEf !@#@\"):");
    gets_s(input);
 
    for (int i = 0; i < strlen(input); i++)
    {
        c = input[i];
 
        //입력한 문자가 소문자인가 ?
        if (c >= 'a' && c <= 'z')  
            printf("%c 는 알파벳 소문자\n", c);
        //그렇지 않으면 대문자인가 ?
        else if (c >= 'A' && c <= 'Z')
            printf("%c 는 알파벳 대문자\n", c);
        //그렇지 않으면 숫자인가 ?
        else if (c >= '0' && c <= '9')
            printf("%c 는 숫자\n", c);
        //그렇지 않으면 공백인가?
        else if (c == ' ')
            printf("%c 는 공백\n", c);
        //기타인가 ?
        else
            printf("%c 는 기타 문자\n", c);
    }
 
    //알파벳 대문자는 소문자로, 소문자는 대문자로 변경
    //ASCII 코드 테이블 참조
    for (int i = 0; i < strlen(input); i++)
    {
        c = input[i];
        if (c >= 'a' && c <= 'z')
            putchar(c - 32);
        else if (c >= 'A' && c <= 'Z')
            putchar(c + 32);
        else
            putchar(c);
    }
    return 0;
}
cs

 

실행결과(Output):

ASCII 코드값을 이용한 알파벳 대소문자, 숫자, 공백 식별 결과

 

ASCII 코드 테이블 상에서 알파벳 대문자는 65~90번, 소문자는 97~122번이라고 앞에서 언급했는데요. 테이블을 보면 정확히 32 크기의 간격으로 서로 떨어져 있습니다. 따라서 소문자를 대문자로 변경하기 위해 c-32를 하였고, 반대로 대문자를 소문자로 변경하기 위해서는 c+32를 하였습니다. 이 또한 C/C++에서는 toupper(), tolower() 함수로 대소문자 변경을 지원하는데 이부분도 다음에 기록하도록 하겠습니다.

 

생각했던 것보다 글이 길어졌습니다. 긴글 읽어주셔서 감사합니다. 이상 JollyTree였습니다 (•̀ᴗ•́)و