[메모리] 문자열 비교

[메모리] 문자열 비교

·

2 min read

두 문자열이 같은 내용을 담고 있는지는 어떻게 비교할 수 있을까?

문자열이 저장되어 있는 방식을 들여다보며, 우리가 배운 문자열 자료형을 사용해서 바로 직접적으로 비교가 가능한지 알아보자.


#include <stdio.h>

int main(void)
{
    char *s = "EMMA";
    printf("%p\n", s);        // "E"의 메모리 주소
}
  • 이 코드를 실행하면 s라는 포인터의 값을 출력할 것이다. 즉, "EMMA"라는 문자열의 가장 첫 값인 "E"에 해당하는 메모리 주소를 출력하는 것이다.


printf("%p\n", &s[0]);  // "E"의 메모리 주소
printf("%p\n", &s[1]);  // "M"의 메모리 주소
printf("%p\n", &s[2]);  // "M"의 메모리 주소
printf("%p\n", &s[3]);  // "A"의 메모리 주소
  • 이 코드는 s가 가리키는 곳을 시작으로 0번째부터 3번째까지에 해당하는 문자의 주소값을 출력할 것이다.

문자열은 첫번째 문자를 시작으로 메모리상에서 바로 옆에 저장되어 있다.

그렇기 때문에 가장 첫 번째 문자에 해당하는 주소값을 하나씩 증가시키면 바로 옆에 있는 문자의 값을 출력할 수 있는 것이다.

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


문자열을 비교할 때도 아래 코드와 같이 문자열이 저장된 변수를 바로 비교하게 되면 그 변수가 저장되어 있는 주소가 다르기 때문에 다르다는 결과가 나올 것이다.

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

int main(void)
{
    // 사용자로부터 s와 t 두 개의 문자열 입력받아 저장
    string s = get_string("s: ");
    string t = get_string("t: ");

    // 두 문자열을 비교 (각 문자들을 비교)
    if (s == t)
    {
        printf("Same\n");
    }
    else
    {
        printf("Different\n");
    }
}

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


생각해보기

문자열을 비교하는 코드는 어떻게 작성해야 할까?

정답

문자열을 제대로 비교하려면, '주소'가 아닌 각각의 문자들을 비교해야 한다. 반복문을 이용해 내부의 char를 하나씩 비교하면 될 것이다.

#include <stdio.h>
#include <stdbool.h>

bool are_strings_equal(const char *s, const char *t) {
    int i = 0;
    while (s[i] != '\0' && t[i] != '\0') {
        if (s[i] != t[i]) {
            return false;
        }
        i++;
    }
    return s[i] == t[i];
}

int main(void) {
    char *s = "EMMA";
    char *t = "EMMA";

    if (are_strings_equal(s, t)) {
        printf("Same\n");
    } else {
        printf("Different\n");
    }
    return 0;
}