strlwr strupr 대소문자 변환
- 프로그래밍/C/C++
- 2018. 7. 3.
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 |
< 출력 >
0x20은 2진수로 0010 0000 이다.
단 이 방법은 무조건 알파벳만 있어야 한다. 숫자나 다른 기호가 들어가면 정상적으로 출력이 되지 않는다.