strlwr strupr 대소문자 변환


strlwr strupr 대소문자 변환


이번에는 strlwr strupr 대소문자 변환에 대해서 알아보겠다.

일단 strlwr strupr 함수를 사용하려면 string.h 파일을 include 해야 된다.

두 개의 함수를 같이 알아보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
int main()
{
    char arr[100];
    printf("문자열 입력 : ");
    gets_s(arr, sizeof(arr));
 
    strlwr(arr);
    puts(arr);
 
    strupr(arr);
    puts(arr);
    return 0;
}
cs

이렇게 소스코드가 있다. 근데 컴파일을 해보면 이러한 오류가 난다.


??왓더?? _strlwr 뭐 이런식으로 사용 하라는거 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
int main()
{
    char arr[100];
    printf("문자열 입력 : ");
    gets_s(arr, sizeof(arr));
 
    _strlwr(arr);
    puts(arr);
 
    _strupr(arr);
    puts(arr);
    return 0;
}
cs

이렇게 해봤다. 컴파일을 시도해봤는데 또 같은 에러가 뜬다.


어... _strlwr_s 이런식으로 사용하라네.. 아니 그냥 처음부터 이렇게 하라고 알려주든가....

그래서 다시 해보았다. 근데 _s 가 붙으면 오버플로우 방지이니 배열 사이즈도 같이 넣어준다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <string.h>
int main()
{
    char arr[100];
    printf("문자열 입력 : ");
    gets_s(arr, sizeof(arr));
 
    _strlwr_s(arr, sizeof(arr));
    puts(arr);
 
    _strupr_s(arr, sizeof(arr));
    puts(arr);
    return 0;
}
cs

< 출력 >
문자열 입력 : aossuperblogtistorycom
aossuperblogtistorycom
AOSSUPERBLOGTISTORYCOM

이렇게 나온다. 잘 작동이 된다.
그러면 이 함수가 어떻게 동작을 하는지 함수 구현을 통해 알아보자.

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
#include <stdio.h>
char* _strlwr_s(const char *s, size_t n)
{
    char *arr = (char*)s;
    while (*arr) {
        if (*arr >= 97 && *arr <= 122)
            *arr -= 32;
        arr++;
    }
    return arr;
}
char* _strupr_s(const char *s, size_t n)
{
    char *arr = (char*)s;
    while (*arr) {
        if (*arr >= 65 && *arr <= 90)
            *arr += 32;
        arr++;
    }
    return arr;
}
int main()
{
    char arr[100];
    printf("문자열 입력 : ");
    gets_s(arr, sizeof(arr));
 
    _strlwr_s(arr, sizeof(arr));
    puts(arr);
 
    _strupr_s(arr, sizeof(arr));
    puts(arr);
    return 0;
}
cs

여기에 함수를 구현한 소스가 있다.
함수 몸체를 보면 char *arr = (char*)s;가 있다. 이 문구는 함수 인자의 const char *s가 붙여져 있으므로
const는 값을 못 바꾸게 하는 것으로 const 키워드를 지워준 것이다.
그리고 arr이 '\0'을 만날 때까지 반복문을 돌려주고 실행하게 된다.
그리고 sizeof해서 넘겨준거는 넘겨줘서 어떻게 해줘야 될지 몰라서 일단은 가만히 냅뒀다.
나머지는 설명을 안 해도 알겠다.


그럼 함수를 안쓰고 소문자를 대문자로 바꿔보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
main()
{
    char str[] = "aossupertistorycomhello";
    int count = 0;
 
    puts(str);
    count = strlen(str);
    for (int i = 0; i < count; i++)
        str[i] = str[i] & 0xDF;
 
    puts(str);
}
cs

< 출력 >


9행에서 str길이가 몇인지 알아내고 count 변수에 저장한다.
11행에서 str[i] & 0xDF 계산을 해준다 &는 AND 연산 이다.
0xDF가 2진수로 1101 1111 이다.

또 함수를 안쓰고 대문자를 소문자로 바꿔보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <string.h>
main()
{
    char str[] = "AOSSUPERTISTORYCOMHELLO";
    int count = 0;
 
    puts(str);
    count = strlen(str);
    for (int i = 0; i < count; i++)
        str[i] = str[i] | 0x20;
 
    puts(str);
}
cs

< 출력 >


11행에서 str[i] | 0x20 계산을 해준다. | 는 OR 연산이다.
0x20은 2진수로 0010 0000 이다.

단 이 방법은 무조건 알파벳만 있어야 한다. 숫자나 다른 기호가 들어가면 정상적으로 출력이 되지 않는다.

댓글

Designed by JB FACTORY