CS 기초/메모리

[CS50] 문자열 복사

담크 2021. 8. 22. 20:25

지난 포스팅에서 문자열이 메모리에 어떤 방식으로 저장되어있는지, 또 어떻게 불러오고 비교하는지에 대해 공부해봤습니다. 그렇다면 문자열을 다른 곳에 복사할 때는 어떤 방법을 써야 하는지 공부해보도록 하겠습니다.

 

아래와 같이 문자열이 어떻게 복사가 되는지 보기위해 아래와 같이 문자열을 복사해서 첫 문자를 대문자로 바꾸는 코드를 작성해 보겠습니다.

#include <stdio.h>
#include <cs50.h>
#include <ctype.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);
}

처음 입력은 emma로 전부 소문자로 입력한뒤 결과를 봤는데 t뿐 아니라 s까지도 대문자 E로 바뀐 것을 확인할 수 있었습니다. 왜일까요??

그 이유는 string s가 "emma"의 문자 그대로가 아닌 문자열이 있는 메모리의 주소로 저장되기 때문에 string t도 s와 동일한 값의 복사가 아닌 주소가 복사되었기 때문입니다. 

 

그렇다면 실제로 문자열을 복사하려면 어떻게 해야할까요??

바로 메모리 할당 함수인 malloc라는 것을 사용하면 됩니다.

#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <stdlib.h>	//강의엔 안나오지만 실제로 실행해보니까 얘가 필요하다고 하네요
#include <string.h>

int main(void)
{
    char *s = get_string("s: ");
    char *t = malloc(strlen(s) + 1);	//\0때문에 +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);
}

malloc 함수는 정해진 크기만큼 메모리를 할당하는 함수입니다. for문을 이용해서 s문자열 배열에 있는 문자 하나하나를 t배열에 복사해줍니다.

 

또 다른 방법으로는 strcpy가 있는데 strcpy는 string copy로 s의 내용을 t에 복사할 수 있는 코드입니다.

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

int main(void)
{
    char *s = get_string("s: ");
    char *t = malloc(strlen(s) + 1);

    strcpy(t, s);

    t[0] = toupper(t[0]);

    printf("s: %s\n", s);
    printf("t: %s\n", t);
}

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 메모리' 카테고리의 다른 글

[CS50] 파일 쓰기  (0) 2021.08.25
[CS50] 메모리 교환, 스택, 힙  (0) 2021.08.24
[CS50] 문자열 비교  (0) 2021.08.21
[CS50] 문자열  (0) 2021.08.20
[CS50] 포인터  (0) 2021.08.19