[C언어] 문자열을 대소문자로 변환
[C언어] 문자열을 대소문자로 변환
오늘도 문자열 관련 함수를 코딩해 보는 시간을 갖고자 합니다. string.h 헤더파일에서 제공되는 strlwr(), strupr()함수에 대해 이야기를 할까 합니다. strlwr()함수는 문자열을 소문자형태로 변환 시키는 함수이고, strupr()함수는 문자열을 대문자형태로 변환 시키는 함수입니다. 입력된 문자열이 대소문자로 합쳐진 단어일 때 일괄적으로 소문자로 바꾸거나 대문자로 바꿀 때 사용하는 함수입니다. 두 함수를 그냥 불러다 대소문자로 바꾼다면 C언어를 공부 할 의미가 없겠죠. 이 함수를 사용하여 결과를 살펴 본 뒤 이 함수의 동작을 직접 코딩해서 사용자정의 함수로 구현 해 보는 시간을 갖고자 합니다. 이 내용도 예전에 C언어 입문기 때에 한창 프로그램언어에 재미를 붙였을 때 코딩한 거라 최근 post를 쓰면서 과거를 회상하고 시간도 되고 재미가 있네요.
1. 문자열을 대소문자로 변환
#include <string.h>
strlwr(문자열); //소문자로 바꾸기
strupr(문자열); //대문자로 바꾸기
위 두개의 함수로 간단히 문자열을 대소문자로 변환 시킬 수 있습니다.
[코딩]
#include <stdio.h>
#include <string.h>
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 <stdio.h>
#include <string.h>
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언어에서 제공되는 많은 다양한 함수들을 직접 구현해 보세요.
짱짱맨 호출에 응답하였습니다.
방문해주셔서 감사합니다.
간만에 C 코드 보니 반갑네요. 전 대학교 1학년 때 배웠지만, 요즘 학교에서는 안 가르친다죠.
전 2학년 편입해서 배웠는데 6개월 좀 고생했죠. 편입생에 대한 재학생들의 보이지 않는 장벽에 고생을 했었죠. 1년차 전장 타기전까지는 고생하다가 전장 타고 나니 오히려 도움을 주는 위치가 되니 장벽은 없어졌지만요. 인문계열에서 공학쪽으로 편입해서 맨땅에 해딩을 좀 했었는데 ... ㅋㅋㅋ
고생했을 때 삶의 낙이 C언어 코딩이였는데... ^^
요새는 안가르친다니 설마요. C언어 기반 과목들이 많은데 설마 안가르칠려고요.
제가 복학생이었을 때 다른 학교들에서는 신입생들이 C 대신 자바를 배운다는 이야기를 들었었지요. 그게 10년도 더 됐었네요. 그리고 언제부턴가 C는 학교들이 잘 안 가르치는 언어가 되었더라구요. 제 모교에서는 여전히 신입생들에게 C를 가르치는거 같기는 합니다.