C 언어에서 문자열 변환 함수를 사용하지 않고 대문자를 소문자로 변환하는 방법을 알아보기 전에, 먼저 strlwr() 함수를 활용해 대문자를 소문자로 바꾸는 프로그램을 살펴보겠습니다. 기본 동작 원리를 먼저 이해하면, 이후에 직접 변환 로직을 구현하는 과정이 훨씬 명확해집니다.
예제 1: strlwr() 함수를 사용한 변환
#include <stdio.h>
#include <string.h>
int main() {
char string[50];
printf("enter a string to convert to lower case\n");
gets(string); // 문자열 입력받기
printf("The string in lower case: %s\n", strlwr(string)); // strlwr은 모든 대문자를 소문자로 변환
return 0;
}
실행 결과
enter a string to convert to lower case CProgramming LangUage The string in lower case: cprogramming language
strlwr() 함수는 <string.h> 헤더 파일에 포함되어 있으며, 전달받은 문자열의 모든 대문자를 소문자로 자동 변환해 줍니다. 하지만 실제 개발에서는 내부 동작 원리를 이해하기 위해 함수 없이 직접 구현해 보는 것도 매우 좋은 학습 방법입니다.
이제 미리 정의된 함수를 사용하지 않고, ASCII 코드 값을 이용해 직접 변환 로직을 작성하는 프로그램을 살펴보겠습니다.
예제 2: 변환 함수 없이 직접 구현하기
#include <stdio.h>
void main() {
// for 루프용 변수(각 문자의 위치를 읽기 위함)와 문자열 변수 선언 //
int i;
char string[40];
// 문자열 입력받기 //
printf("Enter the string : ");
gets(string);
// 문자열의 각 문자를 순회하는 for 루프 //
for (i = 0; string[i] != '\0'; i++) {
if (string[i] >= 65 && string[i] <= 90) {
string[i] = string[i] + 32;
}
}
printf("The converted lower case string is : ");
puts(string);
}
실행 결과
Enter the string : TUTORIALSPOINT The converted lower case string is : tutorialspoint
동작 원리 설명
이 프로그램의 핵심은 ASCII 코드 값의 규칙성입니다. 아스키 코드에서 대문자 'A'는 65부터 시작하고, 소문자 'a'는 97부터 시작합니다. 즉, 같은 글자의 대문자와 소문자 사이에는 항상 32만큼의 차이가 존재합니다.
- 대문자 범위: 65('A') ~ 90('Z')
- 소문자 범위: 97('a') ~ 122('z')
따라서 반복문으로 문자열의 각 문자를 하나씩 확인하고, 해당 문자가 대문자 범위(65~90)에 속한다면 여기에 32를 더해 소문자로 변환할 수 있습니다. 문자열 끝을 나타내는 널 문자('\0')를 만나면 반복문이 종료되며, 최종적으로 변환된 문자열이 화면에 출력됩니다.
참고로 gets() 함수는 입력 크기를 제한하지 못해 버퍼 오버플로우 위험이 있어 현재는 사용이 권장되지 않습니다. 실무 환경에서는 fgets()나 scanf()처럼 입력 크기를 제한할 수 있는 함수를 사용하는 것이 안전합니다.