티스토리 뷰

반응형

※ 본 포스팅은 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다.


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;
}


반응형
프로필사진

Yowu (Yu Yongwoo)

흔한 Node.js/Java 백엔드 개발자입니다
Ubuntu와 MacOS 데스크탑 개발 환경을 선호합니다
최근에는 vscode와 IntelliJ를 사용하고 있습니다
vscode에는 neovim, IntelliJ는 ideaVim
개발용 키보드는 역시 HHKB Pro 2 무각입니다
락 밴드에서 드럼을 쳤습니다

최근에 올라온 글
최근에 달린 댓글
«   2024/03   »
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
31
글 보관함
Total
Today
Yesterday