C++

[강의] 10월 16일 수업정리

k-codestudy 2024. 10. 17. 03:58

오늘도 문제를 풀면서 수업을 진행하였다.

 

문제 1. 문자열을 문자열로 복사

 

주의점 :

  1. 개수를 먼저 셀 경우 루프에서 손해를 보게 된다.
  2. 일반 복사하면서 복사가 가능한지 체크한다
  3. 어떤 상황이라도 반드시 마지막에 '\0' (NULL)을 보장해야 한다.
  4. 최대한 다양한 방법으로 테스트를 진행해 본다.
  5. 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;
}

 

문제 해결 시 놓쳤던 부분과 개선 사항을 정리해 보겠다.

  1. NULL을 보장하지 못함
    - strDst [nCount] = '\0';은 strDst 문자열의 마지막에 '\0'을 추가하는 구문이다. 이를 생략할 경우 Str1의 길이가 Str2보다 짧을 때 문제가 발생하였다.
    - 예를 들어, Str2가 기존에 더 긴 값을 가지고 있었고, Str1이 더 짧은 경우, Str1의 내용이 복사되더라도 '\0'이 추가되지 않으면 Str2의 나머지 값들이 그래도 남아 출력이 된다.
    - '\0'을 추가하는 것은 문자열의 끝을 명시적으로 지정하여, 그 이후게 남아 있는 값을 무시하도록 하는 것이다.
  2. NULL이 초기화를 의미하지는 않는다.
    - '\0'이 추가되면 문자열의 끝을 나타내는 역할을 할 뿐, 그 뒤에 남아 있는 값이 초기화되는 것은 아니다.
    - 이는 문자열 처리에서 중요한 개념으로 '\0' 이후의 값은 무시되지만 실제 메모리에는 그대로 남아 있을 수 있다. 따라서 '\0'을 통해 우리가 필요한 부분까지만 읽도록 제한을 걸어두는 것뿐이다.
  3. 반복문 안에 return을 사용한 것
    - 반복문 내에서 return을 사용하면, 반복문이 도중에 바로 종료되어 버리기 때문에 의도한 만큼의 루프를 돌지 않는다.
    ( return을 기준으로 위아래의 반복하는 횟수가 달라져 버리게 된다. )
    - 이는 break, continue와 유사하게 반복문을 조기에 끝내지만, 함수 자체를 종료시키는 점에서 차이는 있다.
    - 함수 내에서 return을 사용하려면, 그 조건이 반드시 명확하고 함수의 동작을 조기 종료해야 하는 경우에만 사용해야 한다. 그렇지 않으면 반복문이 의도와 다르게 수행을 하지 않아 잘못 짠 코드가 되어버린다.
  4. 조건문 내에서 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