/***********************************************

각 문자열 라이브러리 함수 구현

strcpy : 문자열 복사

strlen : 문자열 길이

strcat : 문자열 붙이기

strcmp : 문자열 비교

strlwr : 대문자 -> 소문자

strupr : 소문자 -> 대문자

atoi : 문자열 -> 정수

***********************************************/

#include <stdio.h>

 

#define ARR_SIZE 20  // 임시 배열들의 크기

#define INT_MAX (1<<31)-1  // int형 최대값

#define INT_MIN 1<<31   // int형 최저값

 

int menu_select(int*);   // 메뉴 함수

int input_string1(char*);   // 입력 함수(하나)

int input_string2(char*, char*); // 입력 함수(둘)

int strcpy_proc(char*, char*);  // 문자열 복사 함수

int strlen_proc(char*);   // 문자열 길이 구하는 함수

int strcat_proc(char*, char*);  // 문자열 붙이기 함수

int strcmp_proc(char*, char*);  // 문자열 비교 함수

int strlwr_proc(char*);  // 대문자 -> 소문자 함수

int strupr_proc(char*);  // 소문자 -> 대문자 함수

int atoi_proc(char*);  // 문자열 -> 정수 함수

int end_proc(void);  // 종료 함수

 

// 메인 함수

int main(void)

{

int nRetry=1, nSelect=0, nLength=0, nCmp=0, nNum=0;  // 프로그램 반복확인, 메뉴 선택, 문자열 길이, 문자열 비교 결과, 문자에서 정수

char sArr[ARR_SIZE]={0};   // 임시 배열(주로 복사본)

char cArr1[ARR_SIZE]={0}, cArr2[ARR_SIZE]={0};  // 임시 입력 배열

 

// 시작

while(nRetry)  // 반복

{

menu_select(&nSelect);   // 메뉴 함수 호출

 

switch(nSelect)   // 메뉴에서 선탠된 값으로 연산 선택

{

case 1 :  // 문자열 복사

input_string1(cArr1);   // 문자열 입력 함수 호출

strcpy_proc(sArr, cArr1);  // 문자열 복사 함수 호출

printf("복사된 문자열 : %s\t원본 문자열 : %s\n", sArr, cArr1);  // 결과 출력

break;

case 2 :  // 문자열 길이

input_string1(cArr1);   // 입력 함수 호출

nLength = strlen_proc(cArr1);  // 문장려 길이 구하는 함수 호출

printf("문자열 %s의 길이는 %d입니다.\n", cArr1, nLength);   // 결과 출력

break;

case 3 :  // 문자열 합치기

input_string2(cArr1, cArr2);  // 문자열 입력 함수 호출 

strcat_proc(cArr1, cArr2);   // 문자열 합치기 함수 호출

printf("합쳐진 문자열 : %s\n", cArr1);   // 결과 출력

break;

case 4 :  // 문자열 비교

input_string2(cArr1, cArr2);   // 입력 함수 호출

nCmp = strcmp_proc(cArr1, cArr2); // 문자열 비교 함수 호출

printf("%d\n", nCmp);  // 결과 출력

break;

case 5 :  // 대문자 -> 소문자

input_string1(cArr1);  // 입력 함수 호출

strlwr_proc(cArr1);   // 대문자 -> 소문자 함수 호출

printf("%s\n", cArr1);  // 결과 출력

break;

case 6 :  // 소문자 -> 대문자

input_string1(cArr1);  // 입력 함수 호출

strupr_proc(cArr1);   // 소문자 -> 대문자 함수 호출

printf("%s\n", cArr1);  // 결과 출력

break;

case 7 :  // 문자열 -> 정수

input_string1(cArr1);   // 입력 함수 호출

nNum = atoi_proc(cArr1);  // 문자열 -> 정수 함수 호출

printf("%d\n", nNum);   // 결과 출력

break;

case 8 :  // 종료

end_proc();  // 종료 메시지 함수 호출

nRetry = 0;  // 반복변수를 0으로 주어 종료

break;

}

}

 

return 0;

}

 

// 메뉴 선택 함수

int menu_select(int* pSelect)

{

puts("\n문자열 관련 라이브러리 함수 구현");

puts("================================");

puts("1. 문자열 복사 (srtcpy)");

puts("2. 문자열 길이 (strlen)");

puts("3. 문자열 붙이기 (strcat)");

puts("4. 문자열 비교 (strcmp)");

puts("5. 문자 대문자->소문자 (strlwr)");

puts("6. 문자 소문자->대문자 (strupr)");

puts("7. 문자열->정수 (atoi)");

puts("8. 종료");

 

do

{

fflush(stdin);

 

printf("메뉴를 선택하시오 : ");

scanf("%d", pSelect);

} while(*pSelect < 1 && *pSelect > 8);  // 특정 범위의 값만 받음

 

return 0;

}

 

// 입력 함수 1

int input_string1(char* pCArr)

{

fflush(stdin);

 

printf("문자열을 입력하시오 : ");

gets(pCArr);   // 문자열 입력

 

return 0;

}

 

// 입력 함수 2

int input_string2(char* pCArr1, char* pCArr2)

{

fflush(stdin);

 

printf("첫 번째 문자열을 입력하시오 : ");

gets(pCArr1);   // 문자열 입력

printf("두 번째 문자열을 입력하시오 : ");

gets(pCArr2);   // 문자열 입력

 

return 0;

}

 

// 문자열 복사 함수

int strcpy_proc(char* pSArr, char* pCArr)

{

while(*pCArr != '\0')  // 두번째 인자의 값이 '\0'이 아닐동안 반복

{

*pSArr = *pCArr;  // 두번째 인자의 각 인덱스의 값을 첫번째 인자의 같은 인덱스로 복사

pSArr++; // 인덱스(주소) 증가

pCArr++; // 인덱스(주소) 증가

 

}

 

*pSArr = *pCArr;   // 마지막 '\0'값 복사

 

return 0;

}

 

// 문자열 길이 구하는 함수

int strlen_proc(char* pCArr)

{

int nCnt=0;  // 길이 변수

 

while(*pCArr != '\0')  // 인자의 값이 '\0'이 아닐동안 반복

{

pCArr++;   // 인덱스(주소)증가

nCnt++;   // 길이 카운터 증가

}

 

return nCnt;   // 길이 값 반환

}

 

// 문자열 붙이기 함수

int strcat_proc(char* pCArr1, char* pCArr2)

{

int nCnt=0;

 

for(; ; pCArr1++)  // 첫번째 인자의 값을 증가시키면서 반복

{

if(*pCArr1 == '\0')   // 첫번째 인자의 값이 '\0' 일 경우

{

while(*pCArr2 != '\0')  // 두번째 인자의 값이 '\0'이 아닐동안 반복

{

*pCArr1 = *pCArr2;  //두번째 인자의 값을 첫번째 인자의 현재 인덱스로 복사

pCArr1++; // 증가

pCArr2++; // 증가

}

 

*pCArr1 = *pCArr2;   // 마지막 '\0' 복사

 

break;  // 종료(반복문 빠져나옴)

}

}

 

return 0;

}

 

// 문자열 비교 함수

int strcmp_proc(char* pCArr1, char* pCArr2)

{

int nCmp=0;  // 비교 값 변수

 

while(pCArr1 != '\0' && pCArr2 != '\0')  // 두 인자가 '\0' 이 아닐 동안 반복

{

if(*pCArr1 < *pCArr2)   // 두 번째 인자의 값이 큰 경우

{

nCmp = -1;   // 비교 값 변수에 -1 대입

break;  // 반복문 종료

}

else if(*pCArr1 > *pCArr2)  // 첫 번째 인자의 값이 큰 경우

{

nCmp = 1;   // 비교 값 변수에 1 대입

break;  // 반복문 종료

}

else  // 같을 경우

{

pCArr1++;  // 증가

pCArr2++;  // 증가

nCmp = 0;  // 비교 값 변수에 0 대입

}

}

 

return nCmp;  // 비교 값 변수 반환

}

 

// 문자열 대문자 -> 소문자

int strlwr_proc(char* pCArr)

{

while(*pCArr != '\0')  // 인자의 값이 '\0'이 아닐 동안 반복

{

if(*pCArr >= 'A' && *pCArr <= 'Z')  // 인자의 값이 'A' ~ 'Z' 이면

*pCArr += 32;   // 인자의 값에 32를 더함 (32 :대문자와 소문자의 차이 값)

 

pCArr++;  // 인덱스 증가

}

 

return 0;

}

 

// 문장려 소문자 -> 대문자

int strupr_proc(char* pCArr)

{

while(*pCArr != '\0')   // 인자의 값이 '\0'이 아닐 동안 반복

{

if(*pCArr >= 'a' && *pCArr <= 'z')  // 인자의 값이 'a' ~ 'z' 이면

*pCArr -= 32;  // 인자의 값에 32를 뺌 (32 :대문자와 소문자의 차이 값)

 

pCArr++;   // 인덱스 증가

}

 

return 0;

}

 

// 문자열에서 정수 추출

int atoi_proc(char* pCArr)

{

int nTNum=0, nSign=1, nCnt=0, nMFlag=0, nPFlag=0;  // 추출된 정수 저장, 부호, 카운터, 음수 플레그, 양수 플레그

 

while(*pCArr != '\0')  // 인자의 값이 '\0'이 아닐 동안 반복

{

if(*pCArr == '-' && nCnt == 0 && nMFlag == 0)  // 인자의 값이 '-' 이고 카운터가 0(숫자가 한번도 안 나온 경우)이고 부호가 최초 한번 나올 경우

{

nSign = -1;  // 부호 변수에 -1 대입

pCArr++;   // 인자 인덱스 증가

nMFlag = 1;  // 음수 부호 플레그

}

else if(*pCArr == '+' && nCnt == 0 && nPFlag == 0)  // 인자의 값이 '+' 이고 카운터가 0(숫자가 한번도 안 나온 경우)이고 부호가 최초 한번 나올 경우

{

nSign = 1;  // 부호 변수에 1 대입

pCArr++;   // 인자 인덱스 증가

nPFlag = 1;  // 음수 부호 플레그

}

else if(*pCArr == ' ' || *pCArr == '\t')  // ' '(공백)이거나 '\t'(탭) 일 경우

{

pCArr++;   // 인자 인덱스 증가

}

else if(*pCArr >= '0' && *pCArr <= '9')   // 인자의 값이 '0' ~ '9' 일 경우

{

if(nCnt > 0)  // 카운터가 0이상일 경우 (문자가 한번이라도 숫자로 변경된 경우)

nTNum *= 10;  // 추출된 정수에 10을 곱함

 

nTNum += ((int)*pCArr - 48);  // 인자값 - 48(ASCII 코드 0과의 차이 값)을 int형으로 변환 후 추출된 정수값 저장 변수와 더함

 

pCArr++;   // 인자 인덱스 증가

nCnt++;   // 카운터 증가

}

Else   // 위의 경우가 아닌 경우

 

break;   // 반복문 종료

}

 

nTNum = nTNum*nSign;  // 추출된 정수값에 부호 값을 곱해줌

 

// 최대 최소값 미 구현

/*

if(nTNum > INT_MAX || nTNum < INT_MIN)

nTNum = nTNum % 65536;

*/

 

return nTNum;  // 결과 값 반환

}

 

// 종료 함수

int end_proc(void)

{

puts("종료합니다.");  // 종료 메시지 출력

 

return 0;

}

 

 

[출처] [C 언어] 문자열 라이브러리 함수 구현|작성자 파하름

'Programming > C/C++' 카테고리의 다른 글

[C/C++] 복합대입연산자  (1) 2010.01.14
[C/C++] sprintf  (0) 2010.01.13
[C/C++] 문자열 복사  (0) 2010.01.13
C++ Programming Style Guide-line  (0) 2009.12.19
Posted by 시그v

블로그 이미지
Computer graphics & Programming
시그v

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 받은 트랙백

최근에 달린 댓글

믹시