Home » 레퍼런스 » C » c언어 strcpy 함수로 문자열 복사를 해 봅시다.

c언어 strcpy 함수로 문자열 복사를 해 봅시다.

c언어 strcpy 함수문자열 복사를 하기 위해 사용합니다. 간단하게 써 보고, 구현도 복잡하지 않으니 직접 해 봅시다.


[그림 1] strcpy 함수

먼저, 각 인자들과 리턴 값에 대한 설명은 아래와 같습니다.

  • 리턴 값
    • dest의 주소
  • dest
    • 복사 받을 문자열의 주소
  • ori
    • 복사할 대상이 되는 문자열의 주소. 원본을 의미합니다.

쉽게 말해 ori 를 dest 로 복사한다고 생각하시면 되겠습니다. 이것이 어떻게 동작하는지 간단하게 도식화 해서 그려보겠습니다.

먼저 복사할 대상이 되는 문자열 s가 있습니다. “ab”가 있습니다. “b” 뒤에는 문자열의 끝을 표시하는 널 문자가 있습니다.

이제 복사 받을 문자열 t가 있습니다. s로부터 t로 복사를 할 것인데요. null 문자를 만나면, 문자열의 끝을 나타내는 널 문자까지 복사하고 멈출 거에요.

먼저, 문자열 s의 1번째 문자인 ‘a’를 t에 복사합니다. 널 문자가 아니므로, 다음 문자를 탐색합니다.

다음에, 문자열 s의 2번째 문자인 ‘b’를 t에 복사합니다. 널 문자가 아니므로, 다음 문자를 탐색합니다.

다음에, 3번째 문자를 복사하는데요. nil. 즉 널 문자를 만났습니다. 그러므로 nil까지 복사하고 끝냅니다. 여기서 memcpy와 비슷하다고 생각할 수 있습니다. memcpy는 3번째 인자로 복사할 byte 수를 받아요. 고로, 끝나는 조건이 특정 바이트만큼 복사했을 때입니다. 반면에, strcpy는 끝나는 조건이 널 문자를 만났을 때입니다. 복사가 끝나는 조건이 다르다는 점 유념하시면 되겠습니다.


몇 가지 예제를 보겠습니다.

[그림 2] 예제 1번 프로그램

예제 1번 프로그램입니다. 처음에 ori는 “ab”라는 문자열이, str에는 “aaaaa”가 저장되어 있었습니다. 이를 그림으로 그리면 아래와 같습니다.

이 상태에서 ori에 있는 것을 str에 모두 복사하겠습니다. ‘a’, ‘b’, nil이 str[0], str[1], str[2]에 들어갈 겁니다. 그러면 아래 그림과 같은 상태가 됩니다.

str[0]부터 오른쪽으로 읽어봅시다. ‘a’, ‘b’, nil 요렇게 나오지요. 널 문자열을 만나면 문자열의 끝입니다. 따라서, str을 출력하면, “ab”가 나오게 됩니다.

[그림 3] 예제 1번 프로그램의 결과

“ab”가 나왔군요. c언어 strcpy는 몇 가지 조심해야 할 점이 있어요. 그 중 하나는 경계 검사를 하지 않는다는 것입니다.

[그림 4] 경계 검사를 하지 않는 c언어 strlen 함수

이 프로그램은 길이 10짜리 str 배열에, 길이 1만짜리 문자열 ori를 복사한 것입니다. 결과가 어떻게 나올까요?

[그림 5] 결과

segmentation fault가 뜹니다. 복귀 주소를 다른 값으로 덮어버렸기 때문입니다. 그리고, 한 가지 더 주의해야 할 사항이 있습니다. 복사할 문자열과 복사 받을 문자열의 space가 겹치면 안 됩니다. 이건 사실 복사하는 함수들을 쓸 때 주의해야 할 점이기도 합니다.


이제 직접 구현해 봅시다.

[그림 6] 예제 2번 프로그램의 my_strcpy 함수

예제 2번은 my_strcpy를 직접 구현한 것입니다. c언어 strcpy 함수가 복사할 원본 문자열로부터 복사받을 문자열로 데이터를 옮기는 것이라고 했지요. for loop는 복사받을 문자열로부터 nill 문자열을 만날 때 까지 탐색을 합니다. 그러면서 무엇을 하나요? dest 배열에 복사하고 있어요.

다음, 3번째 줄은 0을 넣습니다. ori[pos]가 0이라는 의미는, 원본 문자열의 pos번째 위치에 널 문자가 나왔다는 것을 의미합니다. 따라서, dest[pos]에도 0을 넣어줍니다.

[그림 7] 예제 2번 프로그램의 main 함수

이제 구현된 my_strcpy를 main에서 쓰면 됩니다.

Leave a Comment

17 − 8 =