티스토리 뷰
strlen, strcmp, strcat, strcpy, strrev, strtok, atoi, itoa 설명 및 함수로 구현
Yowu 2014. 1. 16. 20:54※ 본 포스팅은 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다.
strlen : 공백을 포함한 총 문자열의 길이를 구한다. 인자로는 (길이를 구할 문자열 혹은 변수)가 들어가며, string.h에 정의되어 있다.
strcmp : 문자열 비교 시 길이가 아닌 각각의 아스키 코드 값의 크기에 따라 A문자열 > B문자열 보다 크면 0보다 큰 값을 리턴, A문자열 > B문자열 과 같으면 0을 리턴, A문자열 > B문자열 보다 작으면 0보다 작은 값을 리턴 한다. string.h에 정의되어 있다.
strcat : 특정 문자열에 다른 문자열을 이어 붙인다. 인자로는 (대상 변수, 붙일 문자열 혹은 변수)이며 string.h에 정의되어 있다.
strcpy : 문자열을 복사하는 함수이다. 인자로는 (복사 받을 변수, 복사할 문자열 혹은 변수)가 들어가며 string.h에 정의되어 있다.
strrev : 문자열을 뒤집는다. 인자로는 (뒤집을 변수)가 들어가며 string.h에 정의되어 있다.
strtok : 특정 문자열을 기준으로 잘라서 출력하는 함수이다. 인자로는 (변수, 자를 기준의 값)이 들어가며, string.h에 정의되어 있다.
atoi : 문자로 표현된 정수를 int형 정수로 변환해주는 함수이다. 만약 변환할 수 없는 문자가 나타나면 그 전까지만 변환한다. 인자로는 (변환한 문자열 변수)가 들어가며 stdlib.h에 정의되어 있다.
itoa : int형 정수로 표현된 값을 문자형 정수로 변환한다. 인자로는(변환할 변수, 변환 값이 저장될 변수, 표현할 진법)이 들어가며 stdlib.h에 정의되어 있다.
//소스코드에서 strcmp 사용자 정의함수는 플러그인 오류로 뺐습니다.
#include#include #include int YoWu_strlen(char *); //사용자 정의 함수로 구현한 strlen 선언부 int YoWu_strcmp(char *, char *); //사용자 정의 함수로 구현한 strcmp 선언부 char *YoWu_strcat(char *, char *); //사용자 정의 함수로 구현한 strcat 선언부 char *YoWu_strcpy(char *, char *); //사용자 정의 함수로 구현한 strtok 선언부 char *YoWu_strtok(char *, char); //사용자 정의 함수로 구현한 strtok 선언부 char *YoWu_strrev(char *); //사용자 정의 함수로 구현한 strrev 선언부 int YoWu_atoi(char *); //사용자 정의 함수로 구현한 atoi 선언부 char *YoWu_itoa(int, char *, int); //사용자 정의 함수로 구현한 itoa 선언부 void main() { //테스트용 char 변수 str1, str2, empty_str, num1; //테스트용 int 변수 : num2(itoa에서 사용됨) char str1[] = {"CAT-CERT JUNIOR_YoWu"}; char str2[20] = {"CAT-"}; char empty_str[100]; char num1[] = {"910423_YoWu"}; int num2 = 910423; printf("origin_str1\t: %s\n",str1); //여기서는 원래의 str1, str2의 값을 출력합니다. printf("origin_str2\t: %s\n\n", str2); printf("origin_strlen(str1)\t\t: %d\n", strlen(str1)); //string.h에 정의된 strlen(str1)의 실행결과 printf("YoWu_strlen(str1)\t\t: %d\n", YoWu_strlen(str1)); //사용자 정의 함수로 구현한 strlen의 실행결과 printf("-------------------------------\n"); //구분선 출력 printf("origin_strcmp(str1,str2)\t: %d\n", strcmp(str1, str2)); //string.h에 정의된 strcmp(str1, str2)의 실행결과 printf("YoWu_strcmp(str1,str2)\t\t: %d\n", YoWu_strcmp(str1, str2)); //사용자 정의 함수로 구현한 strcmp의 결과 printf("-------------------------------\n"); printf("origin_strcat CERT\t: %s\n", strcat(str2, "CERT")); //string.h에 정의된 strcat(str2, "CERT")의 실행결과 printf("YoWu_strcat CERT\t: %s\n", YoWu_strcat(str2, "CERT")); //사용자 정의 함수로 구현한 strcat의 실행결과 위에서 실행된 strcat(str2, "CERT")에 이어서 실행되었으므로 CERT가 두번 들어간다 printf("-------------------------------\n"); printf("origin_strcpy(empty_str,str2)\t: %s\n",strcpy(empty_str, str2)); //string.h에 정의된 strcpy(empty_str,str2)의 실행결과 printf("YoWu_strcpy(empty_str,str1)\t: %s\n",YoWu_strcpy(empty_str, str1)); //사용자 정의 함수로 구현한 strcpy(empty_str,str1)의 실행결과 printf("-------------------------------\n"); printf("origin_strtok(str1,\"-\")\t\t: %s\n",strtok(str1, "_")); //string.h에 정의된 strtok 사용(str1에서 _가 출력된 이후부분이 잘렸다) printf("YoWu_strtok(str1,\" \")\t\t: %s\n",YoWu_strtok(str1, " ")); //사용자 정의함수로 구현한 strtok 사용(마찬가지로 str1에서 공백(스페이스)가 출력된 이후부분이 잘렸다. printf("-------------------------------\n"); printf("origin_strrev(str1)\t: %s\n", strrev(str1)); //string.h에 정의된 strrev(str1) 실행결과 printf("YoWu_strrev(str1)\t: %s\n", YoWu_strrev(str1)); //사용자 정의 함수로 구현한 strrev 실행결과. 위에서 뒤집힌 문자열이 다시 원래대로 뒤집혔다. printf("-------------------------------\n\n"); printf("origin_num1(char)\t: %s\n",num1); //atoi와 itoa 함수에서 사용될 두 변수의 원형을 출력함 printf("origin_num2(int)\t: %d\n\n",num2); printf("origin_atoi(num1)\t: %d\n",atoi(num1)); //stdlib.h에 정의된 atoi(num1)의 실행결과 printf("YoWu_atoi(num1)\t\t: %d\n",YoWu_atoi(num1)); //사용자 정의함수로 구현한 atoi의 실행결과 printf("-------------------------------\n"); printf("origin_itoa(num2,empty_str,16)\t: %s\n", itoa(num2, empty_str, 16)); //stdlib.h에 정의된 itoa(num2, empty_str, 16)의 실행결과, empty_str에 num2의 정수값을 16진수로 바꿔 문자열로 입력하라는 뜻 printf("YoWu_itoa(num2,empty_str,16)\t: %s\n", YoWu_itoa(num2, empty_str, 16)); //사용자 정의함수로 구현한 itoa의 실행결과 } int YoWu_strlen(char *str) { //사용자 정의 함수 strlen int i=1; for(i=1; *(str+i)!=0; i++); //포인터로 넘어온 str의 배열의 계속 체크해가면서 i를 증가. 그러다가 str[i]에 NULL이 나타나면 종료 return i; } //그리고 i값을 리턴(i의 수치가 문자열 길이와 같으므로) char *YoWu_strcat(char *str1, char *str2) { //사용자 정의 함수 strcat, 두 개의 문자열을 주소 값으로 받아온다. int i,j=0; for(i=0; str1[i]!=0; i++); //str1의 끝 부분까지 for문이 돌고 멈춘다. for(i; str2[j]!=0; i++) //j는 str2의 첫글자부터 읽어오기 시작하고 { str1[i]=str2[j]; //i는 str1의 마지막 부분부터 str2의 문자를 넣어준다. j++; } return str1; } char *YoWu_strcpy(char *str1, char *str2) { //자용자 정의 함수 strcpy, str2의 내용을 str1에 복사한다. int i; for(i=0; str2[i]!=0; i++) //str2의 배열에서 NULL이 나타날때 까지 for문이 돌아간다. { str1[i]=str2[i]; //그리고 str1에 계속해서 str2의 값을 대입한다. str1[i+1]=0; //모든 문자열의 마지막 부분에는 NULL 값이 들어가야하므로 i+1 배열에 NULL을 넣어준다. } //다음 i값이 있으면 str1[i+1]에서 들어가 NULL값이 다른 문자로 덮어 씌여진다. return str1; } char *YoWu_strtok(char *str1, char *ch) { //사용자 정의 함수 strcat, str1의 내용과 구분자인 ch를 인자로써 받아온다. int i; for(i=0; str1[i]!=0; i++) //str1을 검사하여 NULL이 나올때까지 하되 { if(str1[i]==*ch) //str1을 검사중 구분자가 나타난다면 { str1[i]=NULL; //해당 구분자가 있는 자리에 NULL을 넣어주고 return str1; //str1을 리턴해준다. } } return NULL; //만약 문자열 안에 구분자가 없다면 NULL을 리턴해준다. } char *YoWu_strrev(char *str1) { //사용자 정의 함수, strrev, str1을 받아와서 뒤집는다. char str2[100]; //str1의 사본을 만들기위한 임시 배열. int i,j; for(i=0; str1[i]!=0; i++) //str1의 문자열을 str2에 복사한다. { str2[i]=str1[i]; } str2[i]=0; //복사당한 str2의 마지막에 NULL 값을 넣어준다. for(j=0; str1[j]!=0; j++) //str2의 마지막 값을 차례대로 str1의 첫 인덱스에 넣어준다. { str1[j]=str2[i-1]; //str2[i-1]인 이유는 str2[i]는 NULL이기 때문 i--; } return str1; } int YoWu_atoi(char *str1) //사용자 정의 atoi 함수, 인자로써 문자열 상태의 정수를 받아온다 { int i; int num=0; //각 배열의 자릿수들을 더해주기 위한 변수 int mul=1; //자릿수를 구하기 위한 변수 for(i=0; str1[i]>='0' && str1[i]<='9'; i++); //문자열 배열에 '0'~'9'사이의 문자만 정수로 변환하기 위해 그 갯수를 i로 카운트한다 for(i=i-1; i>=0; i--) //그리고 마지막 부분(i)에서 부터 10의 제곱으로써 정수 배열에 저장한다. { num = num+(mul*(str1[i]-'0')); mul = mul*10; } return num; } char *YoWu_itoa(int num, char *str, int bin) //사용자 정의 함수 itoa, 인자로써 문자열로 변환할 정수 값과, 변환된 값이 저장될 변수 그리고 어느 진법으로 표시할 것인가 하는 진수 값이 들어온다. { int i; int tmpnum; //num의 복사본이다. int one; //정수의 마지막 자릿수의 값을 저장하기 위한 변수이다. tmpnum=num; for(i=0; num>0; i++) //for문의 조건은 num이 0이 될 때까지이다. { one = num%bin; //one에 bin으로 나눈 나머지 값을 넣는다. if(one>=10) //나머지 값이 10보다 클 경우 문자 값을 더해준다. { str[i]=(one-10)+'a'; //10을 빼는 이유는 만약 값이 10이 들어올경우 'a'가 아니라 'k'가 출력되기 때문, 십의 자리를 버려야한다. } else //나머지 값이 10보다 작을 경우 { str[i]=one+'0'; //그냥 문자 '0'을 더해준다 } num = num/bin; //위에서 한자리 값의 연산이 끝났으므로 자릿수를 줄여준다. } YoWu_strrev(str); //지금 배열에는 값이 뒤집혀서 들어가있다. (끝에 자리부터 연산을 첫 자리에 했기때문에) 이를 원래대로 만들기 위해 위에서 만든 사용자 정의함수 YoWu_strrev를 사용했다. return str; }
'개인공부 > C and C++' 카테고리의 다른 글
구조체 파일 위치 지시자 (0) | 2014.01.17 |
---|---|
struct member alignment(구조체 멤버 정렬)에 대해 (0) | 2014.01.16 |
realloc, calloc 함수 및 예제 (1) | 2014.01.16 |
Call by value와 Call by reference에 대해 (5) | 2014.01.16 |
컴파일러(Complier), 링커(Linker)에 대해 (1) | 2014.01.16 |
오버플로우(overflow)시 전혀 다른 값이 나오는 이유 (2) | 2014.01.16 |
변수와 메모리 관계에 대해 (0) | 2014.01.16 |