CODE CAVE

[C언어] 문자열 개념 및 문자열끼리 비교하기 - strcmp 본문

Programming

[C언어] 문자열 개념 및 문자열끼리 비교하기 - strcmp

코드케이브 2016. 6. 7. 03:33



문자열은 문자(char)의 나열 입니다.

다른 언어에서도 마찬가지로 문자의 나열이지만 문자열은 자주 쓰이기 때문에 Java에선 String 이란 문자열 타입을 지원하죠.


하지만 C언어는 따로 문자열 타입이 없기 때문에 배열로 표현합니다.

문자열 타입을 대체하는 char 형 배열은 한글자를 나타내는 char가 여러개 연속되서 메모리에 저장되는 것이죠.


char str[10];


이라고 선언 해놓으면 메모리에 str[0]~[10] 까지 11 byte가 연속적으로 잡힙니다.


0~9 까지는 일반 문자가 채워질 것이고, [10]에는 \0(NULL) 문자가 채워집니다. 


NULL은 문자들의 나열(문자배열/문자열)의 끝을 알려주는 문자입니다. 


이 배열은 끝에 도달했다고 알려주는 역할이죠, 이게 없다면 메모리에서 뭔가 읽을 때 끝을 모르고 다 읽기 때문에 중요한 문자라고 할 수 있습니다.



str 자체에는 시작주소가 있습니다. 즉, str의 시작 위치인 str[0]의 주소가 시작주소입니다.


char str[10] = "12345";


위와 같이 선언 및 초기화가 되있다고 할 때, str[0]을 출력하면 '1' 이 나옵니다. 


이건 단순히 "str[0]의 데이터를 꺼내와라" 라고 해석 하면 쉽습니다.


하지만 꺼내올거긴한데 저기가 어딘데? 라고 의문을 가져야 합니다.


배열의 이름은 그 배열의 시작주소를 가지고 있습니다. 메모리 주소를 말이죠.


그럼 위의 str을 출력하면 무엇이 나올까요?


그렇습니다! str 배열의 시작 주소가 나옵니다.

즉, str[0]의 주소죠.


그래서 포인터로 배열에 접근하는 방법도 있습니다.


포인터의 장점은 Call by Value로 함수에 매개변수를 복제하게 되어서 연산을 수행해도 실제 바꾸려고 했던 변수가 바뀌지 않을때, 뀌게 하고 싶다면 포인터를 쓰기도 합니다.  


이 부분에 대해서는 나중에 기회되면 포스팅 하도록 하겠습니다..




아무튼 여기까지가 대강 이해가 되신다면 문자열끼리 비교하기로 검색해서 들어오신 분들은 자신들의 실수를 깨닫게 될겁니다 ㅎㅎ


아마 기존에는

if(str1 == str2)

이렇게 비교 하셨을겁니다.



하지만 저것은 str1과 str2의 주소값을 비교하는 것이기 때문에 당연히 문자열 값이 같아도 다르다고 나옵니다.


이것을 비교하려면 문자열은 char의 나열이니까 반복문과 조건문을 활용해서 str을 쭉 비교해야하는데 이런 함수를 저희가 따로 만들필요는 없고 


string.h 에 stcmp라는 함수가 그 역할을 해줍니다.





사용법은


if(strcmp(str1, str2) == 0){
	//문자열이 같으면 0을 반환합니다.
} else {
	//문자열이 같지 않을 경우 
	//str1 > str2 ==> 양수
	//str1 < str1 ==> 음수
	//를 반환합니다.
}


간단하고 직관적이죠? ㅎㅎ


추가 설명은 안해도 될 듯 합니다. 주석으로 설명이 충분히 되셨기를..


감사합니다.





도움이 되셨다면 아래 하트를 뿅..