🙇‍♀️문자열 연습문제

🪐문제1) 문자열 길이를 출력하는 함수

int StrLen(const char* str)
{
	// str이라는 문자열의 길이를 반환

	int len = 0;

	while (true)
	{
		if (str[len] == '\0')
			break;
		len++;
	}

	return len;
}

🪐문제2) 문자열 복사 함수

char* StrCpy(char* dest, char* src)
{
	int i = 0;

	while (true)
	{
		dest[i] = src[i];

		if (src[i] == '\0')
			break;

		i++;
	}

	return dest;
}
// 문제2) 문자열 복사 함수 (포인터 버전)
char* Strcpy(char* dest, char* src)
{
	char* ret = dest;

	while (*src != '\0') // (*src)로 해도 가능
	{
		// *dest++ = *src++;로 해도 같은 뜻
		*dest = *src;
		dest++;
		src++;
	}

	*dest = '\0';

	return ret;
}

포인터 주소가 이동했기 때문에 처음에 위치를 char* ret으로 들고있어야 한다. while은 ()안의 조건이 만족하면 반복하므로 (*src)라고 해도 된다. *dest++ = *src++;은 증감연산자가 후순위 이므로 같은 뜻이다. 마지막에 *dest = '\0'을 해준 이유는 while이 끝나서 '\0'을 복사해주지 않았기 때문이다.

🪐문제3) 문자열 덧붙이는 함수

char* StrCat(char* dest, char* src)
{
	int len = StrLen(dest);

	int i = 0;

	while (true)
	{
		dest[i + len] = src[i];

		if (src[i] == '\0')
			break;

		i++;
	}

	return dest;
}
// 문제3) 문자열 덧붙이는 함수 (포인터 버전)
char* Strcat(char* dest, char* src)
{
	char* ret = dest;

	int len = StrLen(dest);
	dest += len;

	while (true)
	{
		*dest = *src;
		dest++;
		src++;

		if (*src == '\0')
			break;
	}

	return ret;
}

char* retdest의 원래 첫주소를 가지고있다. dest += len;dset의 주소를 len만큼 이동시키는 것과 같다. 만약 int형이라면 안되지만 char형이기 때문에 가능하다.

🪐문제4) 두 문자열을 비교하는 함수

int StrCmp(char* str1, char* str2)
{
	int _ret = 0;
	int i = 0;

	while (true)
	{
		int ret = str1[i] - str2[i];

		if (str1[i] == '\0')
		{
			_ret = -1;
			break;
		}

		if (str2[i] == '\0')
		{
			_ret = 1;
			break;
		}

		if (ret < 0)
		{
			_ret = -1;
			break;
		}
		else if (ret > 0)
		{
			_ret = 1;
			break;
		}

		i++;
	}

	return _ret;
}

내가 만든 버전인데 넘 지저분하다.. 아스키코드 값으로 비교하여 작으면 -1, 같으면 0, 크면 1을 반환하는 함수이다. 결과를 반환하기 위하여 int _ret;을 설정해 주었다. int ret = str1[i] - str2[i];은 아스키코드 차이 값을 나타낸다. while을 사용했으므로 한글자씩 계속 확인한다. if (str1[i] == '\0')str1이 그전까지는 다 똑같은데 글자가 짧아서 이렇게 된 경우이니 -1을 뱉는다. 그 다음 if (str2[i] == '\0')는 반대 상황 이므로 1을 뱉는다. ret을 비교한다는 것은 한글자씩 쭉쭉 비교하는 것이고 다른경우가 생긴다면 조건문에 걸려서 바로 결과를 뱉게해주고 함수가 종료된다.

// 문제4) 두 문자열을 비교하는 함수 (with rookiss)
int Strcmp(char* a, char* b)
{
	int i = 0;

	while (a[i] != '\0' || b[i] != '\0')
	{
		if (a[i] > b[i])
			return 1;
		if (a[i] < b[i])
			return -1;
		i++;
	}

	return 0;
}

루키스 버전… while (a[i] != '\0' || b[i] != '\0')으로 '\0'을 발견할 때 까지 반복한다. if (a[i] > b[i])는 그냥 글자자체가 아스키코드 값으로 비교가 가능하니까 바로 반환까지 할 수 있었다.

🪐문제5) 문자열을 뒤집는 함수

void ReverseStr(char* str)
{
	int len = StrLen(str);

	for (int i = 0; i < len / 2; i++)
	{
		int temp = str[i];
		str[i] = str[len - 1 - i];
		str[len - 1 - i] = temp;
	}
}

for (int i = 0; i < len / 2; i++)의 조건문에서 len / 2를 한 이유는 홀수라도 어차피 정수로 반환 되기 때문에 저렇게 적어도 상관없다. 절반만 비교할 것이기 때문이다. str[len - 1 - i]을 한 이유는 str[len]'\0'와 같기 때문에 1을 더 빼줘야한다. 스왑이 끝나면 함수도 끝나게 된다.

태그:

카테고리:

업데이트: