C 언어에서는 ASCII 코드의 특성을 활용하면 별도의 라이브러리 함수 없이도 문자열을 손쉽게 대문자로 변환할 수 있습니다. 아래는 사용자가 입력한 문자열을 모두 대문자로 바꾸어 출력하는 프로그램 예제입니다.
예제 코드
#include <stdio.h>
#include <string.h>
int main() {
char s[100];
int i;
printf("\nEnter a string : ");
gets(s);
for (i = 0; s[i]!='\0'; i++) {
if(s[i] >= 'a' && s[i] <= 'z') {
s[i] = s[i] -32;
}
}
printf("\nString in Upper Case = %s", s);
return 0;
}실행 결과
Enter a string : hello world! String in Upper Case = HELLO WORLD!
코드 설명
이 프로그램에서 문자열을 대문자로 변환하는 핵심 로직은 main() 함수 안에 구현되어 있습니다. 먼저 크기가 100인 char형 배열 s[100]을 선언하여 사용자가 입력한 문자열을 저장합니다.
그다음 for 루프를 이용해 문자열의 처음부터 널 종료 문자('\0')를 만날 때까지 각 문자를 하나씩 검사합니다. if 블록에서는 해당 문자가 소문자('a'~'z' 범위)인지 확인하고, 소문자라면 ASCII 값에서 32를 빼서 대문자로 변환합니다.
for (i = 0; s[i]!='\0'; i++) {
if(s[i] >= 'a' && s[i] <= 'z') {
s[i] = s[i] -32;
}
}ASCII 값으로 대문자 변환이 가능한 이유
ASCII 코드표에서 알파벳 대문자와 소문자는 정확히 32만큼의 차이를 가집니다. 예를 들어 'a'의 ASCII 값은 97이고 'A'는 65이므로, 소문자에서 32를 빼면 같은 글자의 대문자가 됩니다. 이러한 규칙성 덕분에 위와 같은 간단한 연산만으로 대소문자 변환이 가능합니다.
참고: 안전한 입력을 위한 대안
예제에 사용된 gets() 함수는 입력 길이를 제한할 수 없어 버퍼 오버플로우 위험이 있으며, C11 표준에서 제거되었습니다. 실무에서는 fgets()를 사용하는 것이 안전합니다.
fgets(s, sizeof(s), stdin);
또한 표준 라이브러리의 toupper() 함수(<ctype.h> 헤더)를 사용하면 동일한 결과를 더 간결하게 얻을 수 있습니다.