본문 바로가기

Programming/C

C 언어 | 문자열의 복사

학습 목표

문자열을 복사할 수 있다.

 

문자열의 복사

문자열을 복사하는 코드를 만들어보자.

 

#include <cs50.h>
#include <ctype.h>
#include <stdio.h>

int main(void)
{
    string s = get_string("s: ");
    string t = s;
    
    t[0] = toupper(t[0]);
    
    printf("s: %s\n",s);
    printf("t: %s\n",t);
}

 

사용자에게 입력값 s("emma")를 받고, t에 복사 후 첫 문자를 대문자로 바꾸는 프로그램을 만들고자 했다. 하지만 계획과 다르게 toupper()함수가 s와 t 모두에 영향을 주어 "Emma"가 출력되었다.

* toupper() 함수를 사용하기 위해 ctype 라이브러리를 추가했다.

 

이유는 다음과 같다.

  • cs50 라이브러리에서 string은 char *로 정의된 새로운 자료형이었다.
  • 변수 s에는 "emma"라는 문자열이 아닌 문자열이 있는 메모리 주소가 저장된다.
  • 따라서 s의 값이 대입된 t도 s와 동일한 주소를 가리킨다.
  • 메모리의 주소를 통한 수정은 해당되는 모든 변수에 반영이 된다.

* cs50 라이브러리에서 string은 char *로 정의된 새로운 자료형이었다는 것을 기억하자.

 

 

이유를 알았으니 실제로 메모리상에서 두 문자열을 복사해보자. 이 때는 메모리 할당 함수 malloc()을 사용한다.

*malloc은 memory allocation을 의미한다.

 

#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    char *s = get_string("s: ");
    char *t = malloc(strlen(s)+1);
    
    for(int i = 0, n = strlen(s); i<n+1; i++)
    {
        t[i] = s[i];
    }
    
    t[0] = toupper(t[0]);
    
    printf("s: %s\n",s);
    printf("t: %s\n",t);
}

 

이번에는 복사된 문자열이 제대로 수정되었다. 코드를 살펴보자.

  • t를 정의할 때 malloc() 함수를 사용했다.
  • t의 크기는 strlen()함수를 통해 받고, 널 종단 문자(\0)까지 고려해 1을 추가시켰다.
  • for 루프를 통해 문자열을 n+1, 즉 널 종단 문자까지 복사했다.
  • 명령 프롬프트를 보면 성공적으로 복사가 된 것을 확인할 수 있다.

* malloc() 함수를 사용하기 위해 stdlib 라이브러리를 추가했다.

 

생각해보기

배운 바와 같이 메모리 할당을 통해 문자열을 복사하지 않고, 단순히 문자열의 주소만 복사했을 때는 어떤 문제가 생길까?

문자열의 주소를 복사해 사용하면 수정할 때마다 데이터의 원본이 손상된다. 

 


 

이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.

 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

 

'Programming > C' 카테고리의 다른 글

C 언어 | 메모리 교환, 스택, 힙  (0) 2021.02.22
C 언어 | 메모리 할당과 해제  (0) 2021.02.22
C 언어 | 문자열의 비교  (0) 2021.02.20
C 언어 | 문자열과 포인터  (0) 2021.02.19
C 언어 | 포인터  (0) 2021.02.19