C 언어 | 문자열의 비교

2021. 2. 20. 00:24Programming/C

학습 목표

문자열이 저장되어 있는 방식에 근거해서 문자열을 비교하는 방법에 대해 설명할 수 있다.

 

문자열의 출력

문자열의 주소를 출력하는 예시를 다시 보자.

 

#include <stdio.h>

int main(void)
{
    char *s = "EMMA";
    printf("%p\n",s);
}

 

앞선 강의에서 문자열의 주소는 s라는 포인터의 값, 즉 문자열의 가장 첫 값인 s[0]의 메모리 주소를 출력한다 배웠다.

 

그렇다면 아래 코드가 무엇을 출력하는지 보자.

printf("%p\n", &s[0]);
printf("%p\n", &s[1]);
printf("%p\n", &s[2]);
printf("%p\n", &s[3]);

 

위의 예제에 코드를 추가(8-11)한 모습이다. 명령 프롬프트로 부터 알 수 있는 것은 다음과 같다.

 

  • &s[0]부터 &s[3]은 문자의 주소 값을 의미한다.
  • 문자열은 첫번째 문자를 시작으로 메모리상 바로 옆에 저장된다.
  • 즉, 가장 첫 번째 문자에 해당하는 주소 값을 하나씩 증가시키면 옆의 문자들을 출력할 수 있다.

이를 사용해 문자를 다른 방식으로 출력해보자.

 

    printf("%c\n",*s);
    printf("%c\n",*(s+1));
    printf("%c\n",*(s+2));
    printf("%c\n",*(s+3));

 

프로그램을 살펴보면 다음과 같다.

 

  • 연산자 *를 사용하면 포인터가 가리키는 값을 출력할 수 있다.
  • 메모리 주소의 규칙을 사용하면 s값을 증가시키며 문자를 출력할 수 있다.
  • 자료형이 char이기 때문에 형식지정자로 %c를 사용한다.

문자열의 비교

사용자로부터 문자열을 받아 비교하는 프로그램을 작성해보자.

 

#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");
    }
}

 

get_string() 함수를 사용해 같은 문자열 'EMMA'를 받았지만 결과는 'different'가 나왔다.

 

앞서 배웠듯 cs 50의 string 자료형은 사실 포인터다. 프로그램 상에서는 'EMMA'라는 값은 같더라도 변수가 저장되어 있는 주소가 다르기 때문에 이같은 결과가 나온 것이다.

 

생각해보기

문자열을 비교하는 코드는 어떻게 작성해야 할까?

강의에서 처럼 배열 인덱스의 주소값을 하나하나 비교하거나, string 라이브러리의 strcmp() 함수를 사용하면 된다.

 


 

이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.

 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

'Programming > C' 카테고리의 다른 글

C 언어 | 메모리 할당과 해제  (0) 2021.02.22
C 언어 | 문자열의 복사  (0) 2021.02.20
C 언어 | 문자열과 포인터  (0) 2021.02.19
C 언어 | 포인터  (0) 2021.02.19
C 언어 | 메모리 주소  (0) 2021.02.19