Table of contents
두 문자열이 같은 내용을 담고 있는지는 어떻게 비교할 수 있을까?
문자열이 저장되어 있는 방식을 들여다보며, 우리가 배운 문자열 자료형을 사용해서 바로 직접적으로 비교가 가능한지 알아보자.
#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;
}