C++ Rookiss Part1 C++ 프로그래밍 입문 : 문자열 연습문제
🙇♀️문자열 연습문제
🪐문제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* ret
은 dest
의 원래 첫주소를 가지고있다. 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을 더 빼줘야한다. 스왑이 끝나면 함수도 끝나게 된다.