[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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바