본문 바로가기

프로그래밍/C

[library] toupper 구현하기

📌 매뉴얼 (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
Recent Posts
Popular Posts
Recent Comments