C언어 문자열 비교하기
C언어에 문자열을 비교해주는 기본 라이브러리 함수가 존재하는데 strcmp와 strncmp가 그것이다.
보통 문자열을 비교하고자 할때 아래와 같은 실수를 많이 한다.
int main(void) {
char str1[] = "My String";
char str2[] = "My String";
if (str1 == str2)
puts("Equal");
else
puts("Not equal");
return 0;
}
이 코드를 언듯보면 문자열을 비교하는것 같다. 하지만 절대로 Equal이 출력될 수 없다.
그 이유는 저 코드는 문자열을 비교하는것이 아니라 배열str1과 str2의 주소값을 비교하기 때문이다.
그래서 문자열의 내용을 비교하는 함수를 별도로 호출하여야한다.
strcmp, strncmp
strcmp와 strncmp는 아래와 같은 결과를 반환한다.
ex)strcmp(str1,str2); strncmp(str1,str2,3);
str1이 더 크면 0보다 큰 값 반환(양수)
str2가 더 크면 0보다 작은 값 반환(음수)
내용이 같으면 0 반환
여기서 strncmp에서 세번째로 전달되는 인자의 수 만큼 앞에서 시작하여 그 수만큼 부분적으로 비교한다.
그리고 문자의 크고 작음은 아스키 코드의 값을 기준으로 한다.
아래의 코드 작성 실행하여 보자.
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996) // scanf 보안 경고 제거용
int main(void) {
char str1[20];
char str2[20];
printf("문자열 입력 1: ");
scanf("%s", str1);
printf("문자열 입력 2: ");
scanf("%s", str2);
if (!strcmp(str1, str2)) {
puts("두 문자열은 완벽히 동일합니다.");
}
else {
puts("두 문자열은 일치하지 하지않습니다.");
if (!strncmp(str1, str2, 3))
puts("그러나 앞 세글자는 동일 합니다.");
}
return 0;
}
이 코드에서 조건식을 보도록하자.
if (!strcmp(str1, str2)), if (!strncmp(str1, str2, 3)) 조건식을 이렇게 써준 이유는 위에서 설명한것 처럼 문자열이 일치할 때 0을 반환 하도록 되어있다.
그런데 0은 거짓을 의미한다 그래서 if에서 거짓이라 판단하고 else로 넘어 가기때문에 !(not)연산을 하여 거짓을 참으로 바꾼다.
'C' 카테고리의 다른 글
C언어 구조체의 정의와 구조체 변수 선언과 사용법 (0) | 2014.08.11 |
---|---|
C언어 문자열을 정수와 실수로 변환하자 (0) | 2014.08.10 |
C언어 문자열 복사하여 덧붙이기 (strcat, strncat) (0) | 2014.08.07 |
C언어 문자열 복사하기(strcpy, strncpy) (2) | 2014.08.04 |
C언어 스트림(stream)의 활용 - 문자열 단위 입출력 함수 (2) | 2014.07.27 |