오늘도 문제를 풀면서 수업을 진행하였다.
문제 1. 문자열을 문자열로 복사
주의점 :
- 개수를 먼저 셀 경우 루프에서 손해를 보게 된다.
- 일반 복사하면서 복사가 가능한지 체크한다
- 어떤 상황이라도 반드시 마지막에 '\0' (NULL)을 보장해야 한다.
- 최대한 다양한 방법으로 테스트를 진행해 본다.
- strSrc에 데이터가 있고 strDst에 공간이 있을 만 복사를 진행한다.
#include <iostream>
bool strCopy(const char* strSrc, char* strDst, int nDstSize);
int main()
{
char Str1[64] = "asfasasfasf1231245a";
char Str2[64] = "khjkhj";
if (strCopy(Str1, Str2, 64))
printf("성공\n");
else
printf("실패\n");
printf("%s\n", Str2);
}
bool strCopy(const char* strSrc, char* strDst, int nDstSize)
{
int nCount{};
for (int i = 0; strSrc[i] != '\0'; i++)
{
if (strSrc[i] != '\0' && nDstSize - 1 > nCount)
{
strDst[i] = strSrc[i];
nCount++;
}
}
strDst[nCount] = '\0';
if (strSrc[nCount] != '\0')
return false;
return true;
}
문제 해결 시 놓쳤던 부분과 개선 사항을 정리해 보겠다.
- NULL을 보장하지 못함
- strDst [nCount] = '\0';은 strDst 문자열의 마지막에 '\0'을 추가하는 구문이다. 이를 생략할 경우 Str1의 길이가 Str2보다 짧을 때 문제가 발생하였다.
- 예를 들어, Str2가 기존에 더 긴 값을 가지고 있었고, Str1이 더 짧은 경우, Str1의 내용이 복사되더라도 '\0'이 추가되지 않으면 Str2의 나머지 값들이 그래도 남아 출력이 된다.
- '\0'을 추가하는 것은 문자열의 끝을 명시적으로 지정하여, 그 이후게 남아 있는 값을 무시하도록 하는 것이다. - NULL이 초기화를 의미하지는 않는다.
- '\0'이 추가되면 문자열의 끝을 나타내는 역할을 할 뿐, 그 뒤에 남아 있는 값이 초기화되는 것은 아니다.
- 이는 문자열 처리에서 중요한 개념으로 '\0' 이후의 값은 무시되지만 실제 메모리에는 그대로 남아 있을 수 있다. 따라서 '\0'을 통해 우리가 필요한 부분까지만 읽도록 제한을 걸어두는 것뿐이다. - 반복문 안에 return을 사용한 것
- 반복문 내에서 return을 사용하면, 반복문이 도중에 바로 종료되어 버리기 때문에 의도한 만큼의 루프를 돌지 않는다.
( return을 기준으로 위아래의 반복하는 횟수가 달라져 버리게 된다. )
- 이는 break, continue와 유사하게 반복문을 조기에 끝내지만, 함수 자체를 종료시키는 점에서 차이는 있다.
- 함수 내에서 return을 사용하려면, 그 조건이 반드시 명확하고 함수의 동작을 조기 종료해야 하는 경우에만 사용해야 한다. 그렇지 않으면 반복문이 의도와 다르게 수행을 하지 않아 잘못 짠 코드가 되어버린다. - 조건문 내에서 strSrc [i]!= '\0'을 쓰지 않음
- 문자열 복사 시, strSrc [i]의 값이 '\0'이 아닌 경우에만 strDst의 값을 복사를 진행해야 한다.
- 이를 정확히 판단하지 않고 진행하게 되면 문자열이 올바르게 끝나지 않아 strDst가 잘못된 값을 가지게 될 수도 있다.
- 정확한 조건문을 통해 strSrc에 데이터가 존재할 때만 strDst에 복사를 하도록 해야 한다.
'C++' 카테고리의 다른 글
[강의] 10월 18일 수업정리 (1) | 2024.10.20 |
---|---|
[강의] 10월 17일 수업정리 (1) | 2024.10.18 |
[강의] 10월 15일 수업정리 (1) | 2024.10.16 |
[강의] 10월 11일 수업정리 (1) | 2024.10.14 |
[강의] 10월 10일 수업정리 (2) | 2024.10.11 |