[CS50] 메모리 - 문자열 비교

TIL

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

문자열이 저장되어 있는 방식을 들여다보며, 문자열을 직접 비교하는 것이 가능한지 알아보자.

문자열의 메모리 주소

#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)
{
    string s = get_string("s: ");
    string t = get_string("t: ");

    if (s == t)
    {
        printf("Same\n");
    }
    else
    {
        printf("Different\n");
    }
}

변수가 저장하고 있는 것은 문자열의 내용이 아니라 메모리 주소다.

두 문자열은 서로 다른 메모리 주소에 저장되어 있으므로 항상 "Different"가 출력된다.

s → 0x100 ("EMMA")
t → 0x200 ("EMMA")

s == t → 0x100 == 0x200 → false

내용은 같지만 주소가 다르므로 다르다고 판단한다.

 

올바른 문자열 비교

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

#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;
}
  • 각 문자를 순서대로 비교
  • 다른 문자를 발견하면 즉시 false 반환
  • 모든 문자가 같고 둘 다 널 종단 문자에 도달하면 true 반환

 

strcmp 함수 사용

C 표준 라이브러리의 strcmp 함수를 사용하면 더 간단하다.

#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");
    }
}
  • 0: 두 문자열이 같음
  • 음수: 첫 번째 문자열이 사전순으로 앞
  • 양수: 첫 번째 문자열이 사전순으로 뒤

 

비교 방법 요약

방법 비교 대상 결과
s == t 메모리 주소 ❌ 잘못된 비교
strcmp(s, t) 문자열 내용 ✅ 올바른 비교
직접 구현 각 문자 ✅ 올바른 비교

 

'TIL' 카테고리의 다른 글

[CS50] 메모리 - 메모리 할당과 해제  (0) 2025.11.08
[CS50] 메모리 - 문자열 복사  (0) 2025.11.08
[CS50] 메모리 - 문자열과 메모리  (0) 2025.11.07
[CS50] 메모리 - 포인터  (0) 2025.11.07
[CS50] 메모리 - 메모리 주소  (0) 2025.11.07
'TIL' 카테고리의 다른 글
  • [CS50] 메모리 - 메모리 할당과 해제
  • [CS50] 메모리 - 문자열 복사
  • [CS50] 메모리 - 문자열과 메모리
  • [CS50] 메모리 - 포인터
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Pages Router
    Spa
    javascript
    자료구조
    앱 라우터
    emotion diary
    트러블 슈팅
    C
    제네릭
    타입 좁히기
    바닐라 자바스크립트
    cs50
    typescript
    배열
    ai 감성 일기장
    useState
    알고리즘
    algorithm
    Trouble Shooting
    react
    페이지 라우터
    generic
    클래스
    memory
    Next.js
    문자열
    함수 타입
    App Router
    인터페이스
    CS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
[CS50] 메모리 - 문자열 비교
상단으로

티스토리툴바