두 문자열이 같은 내용을 담고 있는지는 어떻게 비교할 수 있을까?
문자열이 저장되어 있는 방식을 들여다보며, 문자열을 직접 비교하는 것이 가능한지 알아보자.
문자열의 메모리 주소
#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 |
