오늘은 문자열이 두 개일 때 같은 내용을 담고 있는지?, 또 이 두 개가 직접적으로 비교가 가능한지에 대해 공부해보도록 하겠습니다.
지난 포스팅에서 문자열은 각 문자의 배열이고 각 문자는 메모리에 서로 다른 주소 값을 가지고 있다는 것을 공부했습니다. 실제로 확인해보면
#include <stdio.h>
int main(void)
{
char *s = "EMMA";
printf("%p\n", &s[0]);
printf("%p\n", &s[1]);
printf("%p\n", &s[2]);
printf("%p\n", &s[3]);
}
이렇게 코드를 작성하고 실행했을 때
주소값이 다르게 출력되는 것을 확인할 수 있습니다.
**
여기서 주소값을 보면 첫 번째 문자인 "E"를 시작으로 메모리상에 바로 옆에 저장되어있는 것을 볼 수 있는데요
문자열은 첫번째 문자에서 주소 값을 하나씩 증가시키면 바로 옆에 있는 문자의 값을 출력할 수 있다는 말입니다.
그렇다면 코드도
printf("%c\n", *s);
printf("%c\n", *(s+1));
printf("%c\n", *(s+2));
printf("%c\n", *(s+3));
이렇게 사용할 수 있습니다.
따라서 문자열을 비교하게되면 문자열의 포인터는 각 문자열의 첫 번째 문자의 주소를 가리키기 때문에 같은 문자를 입력하더라도 다르다는 결과가 나오게 됩니다.
#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");
}
}
따라서 정확한 비교를 위해서는 실제 문자열이 저장되어 있는곳으로 이동하여 각 문자를 하나씩 비교해야 합니다.
문자열 비교 가능한 코드 (방법은 많이 있습니다!!)
#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");
}
}
strcmp = string compare의 약자로 ASCII 코드로 비교해서 문자열이 같으면 0을 리턴함
출처
본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)
강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.
'CS 기초 > 메모리' 카테고리의 다른 글
[CS50] 메모리 교환, 스택, 힙 (0) | 2021.08.24 |
---|---|
[CS50] 문자열 복사 (0) | 2021.08.22 |
[CS50] 문자열 (0) | 2021.08.20 |
[CS50] 포인터 (0) | 2021.08.19 |
[CS50] 메모리 주소 (0) | 2021.08.18 |