
📌 매뉴얼 (Linux)
NAME
toupper - convert uppercase
: 대문자로 바꾸기
SYNOPSIS
#include <ctype.h>
int toupper(int c);
DESCRIPTION
These functions convert lowercase letters to uppercase, and vice versa.
If c is a lowercase letter, toupper() returns its uppercase equivalent, if an uppercase repre‐
sentation exists in the current locale. Otherwise, it returns c.
: 이러한 기능은 소문자를 대문자로 변환하고 그 반대의 경우도 마찬가지이다.
c가 소문자인 경우 toupper()는 대문자로 반환하고 그렇지 않으면 c를 반환한다.
RETURN VALUE
The value returned is that of the converted letter, or c if the conversion was not possible.
: 반환되는 값은 변환된 문자 또는 변환이 불가능한 경우에 c를 반환한다.
📌 작성 코드
int do_toupper(int c)
{
if (97 <= c && c <= 122)
c = c & ~(1 << 5);
return (c);
}
📌 코드 리뷰
toupper는 단순하게 소문자 영어를 대문자로 바꿔서 반환해주는데, int 자료형으로 받아 해당 문자를 처리해준다.
함수를 확인해보면, if문에서 97~122에 c가 해당되는지 판별하는데, 아스키 코드 상에서 각각 'a', 'z'를 의미한다.
따라서, 소문자에 해당되면 조건을 만족하고, 이제 대문자로 바꿔만 주면 되는데 단순히 32라는 값을 빼줘도 되지만,
그 대신 이 코드에서는 c = c & ~(1 << 5) 라는 특이한 연산을 하게 된다.
우선 1 << 5 는, 피연산자인 1을 5만큼 왼쪽으로 비트 이동을 시켜준다는 뜻인데,
00000000 00000000 00000000 00000001 에서 5칸 왼쪽으로 이동하여
00000000 00000000 00000000 00100000 가 되어진 상태이다. (int 이므로 32비트)
이제 이 값을 ~ 라는 비트연산자를 활용해서 비트 반전을 시켜줄 것이다.
00000000 00000000 00000000 00100000 는 비트가 반전되어
11111111 11111111 11111111 11011111 로 바뀌게 되고 이를 연산에 활용할 것이다.
기존에 있던 c (예시로 'b' 의 값인 98이 들어있다고 가정)와 & 비트 연산을 해주는데,
AND 연산이므로 둘 다 1일때만 1이 되도록 계산된다. 그럼,
00000000 00000000 00000000 01100010
& 11111111 11111111 11111111 11011111
__________________________________
00000000 00000000 00000000 01000010
이라는 값이 나오게 된다. 이를 10진수로 변환해보면, 66이 나오고, 이는 'B' 를 의미하므로 대문자로 변경되었다.
이렇게 비트연산을 통해 조금 더 컴퓨터에 친화적으로 작업을 해보았던 toupper 였다.
'프로그래밍 > C' 카테고리의 다른 글
[function] perror 함수 알아보기 (2) | 2024.05.20 |
---|---|
[library] tolower 구현하기 (0) | 2024.05.13 |
[library] strdup 구현하기 (0) | 2024.05.13 |
[library] strnstr 구현하기 (0) | 2024.05.10 |
[library] strncmp 구현하기 (0) | 2024.05.10 |