CS 기초/메모리

[CS50] 문자열 비교

담크 2021. 8. 21. 16:27

오늘은 문자열이 두 개일 때 같은 내용을 담고 있는지?, 또 이 두 개가 직접적으로 비교가 가능한지에 대해 공부해보도록 하겠습니다.

 

지난 포스팅에서 문자열은 각 문자의 배열이고 각 문자는 메모리에 서로 다른 주소 값을 가지고 있다는 것을 공부했습니다. 실제로 확인해보면

#include <stdio.h>

int main(void)
{
    char *s = "EMMA";
    printf("%p\n", &s[0]);
    printf("%p\n", &s[1]);
    printf("%p\n", &s[2]);
    printf("%p\n", &s[3]);
}

이렇게 코드를 작성하고 실행했을 때

주소값이 다르게 출력되는 것을 확인할 수 있습니다.

 

**

여기서 주소값을 보면 첫 번째 문자인 "E"를 시작으로 메모리상에 바로 옆에 저장되어있는 것을 볼 수 있는데요

문자열은 첫번째 문자에서 주소 값을 하나씩 증가시키면 바로 옆에 있는 문자의 값을 출력할 수 있다는 말입니다.

그렇다면 코드도

printf("%c\n", *s);
printf("%c\n", *(s+1));
printf("%c\n", *(s+2));
printf("%c\n", *(s+3));

이렇게 사용할 수 있습니다.

 

따라서 문자열을 비교하게되면 문자열의 포인터는 각 문자열의 첫 번째 문자의 주소를 가리키기 때문에 같은 문자를 입력하더라도 다르다는 결과가 나오게 됩니다.

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

int main(void)
{
    string s = get_string("s: ");
    string t = get_string("t: ");

    if(s == t)
    {
        printf("same\n");
    }
    else
    {
        printf("different\n");
    }
}

따라서 정확한 비교를 위해서는 실제 문자열이 저장되어 있는곳으로 이동하여 각 문자를 하나씩 비교해야 합니다.

 

문자열 비교 가능한 코드 (방법은 많이 있습니다!!)

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

int main(void)
{
    string s = get_string("s: ");
    string t = get_string("t: ");

    if(strcmp(s, t) == 0)
    {
        printf("same\n");
    }
    else
    {
        printf("different\n");
    }
}

strcmp = string compare의 약자로 ASCII 코드로 비교해서 문자열이 같으면 0을 리턴함

 


출처

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

 

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

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

[CS50] 메모리 교환, 스택, 힙  (0) 2021.08.24
[CS50] 문자열 복사  (0) 2021.08.22
[CS50] 문자열  (0) 2021.08.20
[CS50] 포인터  (0) 2021.08.19
[CS50] 메모리 주소  (0) 2021.08.18