2010. 1. 13. 23:59 Programming/C/C++
[C/C++] 문자열 라이브러리 함수 구현
/***********************************************
각 문자열 라이브러리 함수 구현
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 |