[CS50] 메모리: 문자열 비교
❄️ David Malan 교수의 모두를 위한 컴퓨터 과학(CS50 2019)을 바탕으로 정리한 내용입니다.
#include <stdio.h>
int main(void)
{
char *s = "EMMA";
// ✅ s는 문자열의 첫 주소(&s[0])이고, * 를 이용해 그 값을 찾아간다면 E라는 값이 있을 것이다.
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");
}
}
위 코드를 실행한 뒤 EMMA
, EMMA
를 입력해보면 “Different”가 출력됩니다.
같은 문자를 입력했음에도 “Different”가 출력되는 이유가 무엇일까요?
이전 시간에 string
자료형은 사실 char *
자료형이라고 했습니다.
따라서 s
와 t
는 get_string()
으로 받아오는 문자열의 “주소”를 담고 있기 때문에,
문자열을 비교할 때 문자열이 저장된 변수를 바로 비교하게 되면 그 변수가 저장되어 있는 주소가 달라 “Different”가 출력되는 것입니다.
만약 위 코드에서 의도한대로 문자열의 “값”을 비교하는 코드는 어떻게 작성해야 할까요?
#include <cs50.h>
#include <stdio.h>
int main(void)
{
char *s = get_string("s: ");
char *t = get_string("t: ");
// 두 문자열을 비교 (각 문자들을 비교)
for (int i = 0; i < strlen(s); i++) {
if (*(s + i) != *(t + 1)) { // // 포인터가 가르키는 문자 비교
printf("Different\n");
return 0;
}
}
printf("Same\n");
}
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char *s = get_string("s: ");
char *t = get_string("t: ");
if (*s == *t)
{
printf("Same\n");
}
else {
printf("Different\n");
}
}
💛 개인 공부 기록용 블로그입니다. 👻