[C언어] 문자열을 대소문자로 변환
오늘도 문자열 관련 함수를 코딩해 보는 시간을 갖고자 합니다. string.h 헤더파일에서 제공되는 strlwr(), strupr()함수에 대해 이야기를 할까 합니다. strlwr()함수는 문자열을 소문자형태로 변환 시키는 함수이고, strupr()함수는 문자열을 대문자형태로 변환 시키는 함수입니다. 입력된 문자열이 대소문자로 합쳐진 단어일 때 일괄적으로 소문자로 바꾸거나 대문자로 바꿀 때 사용하는 함수입니다. 두 함수를 그냥 불러다 대소문자로 바꾼다면 C언어를 공부 할 의미가 없겠죠. 이 함수를 사용하여 결과를 살펴 본 뒤 이 함수의 동작을 직접 코딩해서 사용자정의 함수로 구현 해 보는 시간을 갖고자 합니다. 이 내용도 예전에 C언어 입문기 때에 한창 프로그램언어에 재미를 붙였을 때 코딩한 거라 최근 post를 쓰면서 과거를 회상하고 시간도 되고 재미가 있네요.
1. 문자열을 대소문자로 변환
#include
strlwr(문자열); //소문자로 바꾸기
strupr(문자열); //대문자로 바꾸기
위 두개의 함수로 간단히 문자열을 대소문자로 변환 시킬 수 있습니다.
[코딩]
#include
#include
int main(int argc, char *argv[]) {
char str1[]="aBcDeF";
char str2[]="aBcDeF";
strlwr(str1);
printf("aBcDeF => %s\n", str1);
strupr(str2);
printf("aBcDeF => %s\n", str2);
return 0;
}
온라인 웹컴파일에서는 string.h 파일을 제공되지 않기 때문에 dev-C++ 환경에서 실험 했네요.
[결과]
이렇게 끝나면 post를 쓸 의미가 없지요.
본론으로 strlwr(), strupr()함수를 직접 결과를 살펴 보았으니 만들어 볼까요.
2. strlwr(), strupr()함수 구현
strlwr(문자열)함수 구현
이 함수는 문자열을 소문자로 바꾸는 함수입니다. 문자열은 대소문자가 합쳐져 있기 때문에 소문자의 경우는 무시하고 대문자의 경우에만 소문자로 바꾸는 로직을 짜면 됩니다.
어떻게 하면 될까요. 간단히 if문으로 대문자인지 확인하고 대문자이면 소문자로 바꾸라는 문장만 넣으면 쉽게 이 함수를 구현 할 수 있습니다.
void strwrSub(char str[]){
int i=0;
while(str[i]){
if(str[i]>='A' && str[i]<='Z'){
str[i]=str[i]+32;
}
i++;
}
}
지난 시간에 while()문으로 문자열을 순차적으로 하나씩 읽는 코딩을 해봤었습니다. 이걸 이용하여 순차적으로 str[i]값이 대문자인지 if문으로 위와 같이 표현하면 됩니다. 대문자 일때 해당 문자값에 +32을 하면 소문자로 바뀌게 됩니다. 여기서, 왜 +32인지는 지난 시간에 공부했듯이 아스키 코드값이 대문자와 소문자의 값 차이가 32이기 때문입니다. 궁금하시면 대문자와 소문자를 printf()문으로 찍어보시면 됩니다.
strupr()함수 구현
이 함수는문자열을 대문자로 바꾸는 함수입니다. 위의 strlwr()함수와는 반대의 동작을 수행 하면 되겠죠. if문으로 str[i]문자가 소문자인지 확인하고 소문자이면 반대로 -32로 하면 대문자로 바뀌게 됩니다.
코딩은 다음과 같습니다.
void struprSub(char str[]){
int i=0;
while(str[i]){
if(str[i]>='a' && str[i]<='z'){
str[i]=str[i]-32;
}
i++;
}
}
위 결과가 정상적으로 출력 되는지는 전체 합쳐진 소스로 결과를 대신 합니다.
3. 코딩
[전체소스]
#include
#include
int main(int argc, char *argv[]) {
char str1[]="aBcDeF";
char str2[]="aBcDeF";
char str3[]="aBcDeF";
char str4[]="aBcDeF";
strlwr(str1);
printf("aBcDeF => %s\n", str1);
strupr(str2);
printf("aBcDeF => %s\n", str2);
strwrSub(str3);
printf("aBcDeF => %s\n", str3);
struprSub(str4);
printf("aBcDeF => %s\n", str4);
return 0;
}
void strwrSub(char str[]){
int i=0;
while(str[i]){
if(str[i]>='A' && str[i]<='Z'){
str[i]=str[i]+32;
}
i++;
}
}
void struprSub(char str[]){
int i=0;
while(str[i]){
if(str[i]>='a' && str[i]<='z'){
str[i]=str[i]-32;
}
i++;
}
}
[결과]
마무리
입문 코딩 공부는 다른 것이 없습니다. 쉬운 함수를 가져다가 사용하는 것도 코딩이기는 하지만 그 함수의 동작 의미를 잘 이해하고 그 함수와 유사한 새로운 함수를 만드는 보는 것이 무척 중요합니다. 처음에는 잘 연상이 안되지만 어느정도 연습하다보면 익숙해지면서 코딩에 재미를 붙일 수 있습니다.
여러분들도 한번 C언어에서 제공되는 많은 다양한 함수들을 직접 구현해 보세요.