71. 문자열 비교와 strcmp함수

C언어에서 기본 형식은 비교 연산으로 값의 크기를 비교할 수 있죠.
그런데 배열은 메모리 주소를 값으로 갖기 때문에 비교 연산을 하면 메모리 주소를 비교해요.
개발자는 문자열의 내용을 비교하길 원하는데 메모리 주소를 비교하기 때문에 원하지 않는 결과가 나오지 않아요.
이는 프로그램 버그를 만드는 것이라 주의하세요.

◈ 비교 연산으로 문자열을 비교했을 때의 버그

#include <stdio.h>
#include <string.h>
#define MAX_NAME_LEN      50
int main()
{
    char name1[MAX_NAME_LEN+1] = "hello";
    char name2[MAX_NAME_LEN+1] = "hello";
    if(name1 == name2)
    {
        printf("%s와 %s는 같다.\n",name1,name2);
    }
    else
    {
        printf("%s와 %s는 다르다.\n",name1,name2);
    }
    return 0;
}

◈ 실행 결과

hello와 hello는 다르다.

이러한 문제점을 갖고 있어서 문자열을 비교는 표준 라이브러리 함수를 제공하고 있어요.

int strcmp(const char *str1, const char *str2);
int strncmp(const char *str1, const char *str2, size_t n);

두 가지 함수는 사전식으로 문자열을 비교하죠.
사전식 비교는 맨 앞의 문자부터 비교하는 것으로 차이가 생기면 더 이상 비교하지 않아요.
그리고 비교 결과는 차이가 없을 때 0, 앞쪽이 크면 양수, 뒤쪽이 크면 음수를 반환하죠.

◈ 문자열 비교

#include <stdio.h>
#include <string.h>
#define MAX_NAME_LEN      50
int main()
{
    char name1[MAX_NAME_LEN+1] = "hello";
    char name2[MAX_NAME_LEN+1] = "hello";
    if(strcmp(name1,name2) == 0)
    {
        printf("%s 와 %s는 같다.\n",name1,name2);
    }
    else
    {
        printf("%s 와 %s는 다르다.\n",name1,name2);
    }
    return 0;
}

◈ 실행 결과

hello와 hello는 같다.

◈ 부분 문자열 비교

#include <stdio.h>
#include <string.h>
#define MAX_NAME_LEN      50
int main()
{
    char name1[MAX_NAME_LEN+1] = "hello";
    char name2[MAX_NAME_LEN+1] = "hello world";
    if(strcmp(name1,name2) == 0)
    {
        printf("%s 와 %s는 같다.\n",name1,name2);
    }
    else
    {
        printf("%s 와 %s는 다르다.\n",name1,name2);
    }
    if(strncmp(name1,name2,5) == 0)
    {
        printf("%s 와 %s의 %d개의 문자는 같다.\n",name1,name2,5);
    }
    else
    {
        printf("%s 와 %s의 %d개의 문자는 다르다.\n",name1,name2,5);
    }
    return 0;
}

◈ 실행 결과

hello와 hello world는 다르다.
hello와 hello world의 5개의 문자는 같다.