문자열 비교는 == 비교연산자 와 strcmp 어떤걸 써야 하는가..
C++ 2013. 10. 10. 20:46 |
#include <stdio.h> #include <stdlib.h> #include <string.h> #define __Text "hello" int main(){ char *textarr = "hello" ; char text[] = "hello" ; printf ( "비교대상 : #define __Text \"hello\", 외 스트링 \"hello\"\n" ); printf ( "textarr = %s, %c\ntext[] = %s, %c\n\n" , textarr, *(textarr), text, *text); // 비교 첫번쨰 if (textarr == "hello" ){ printf ( "1. \"hello\"와 textarr 는 같습니다.\n" ); printf ( "주소값 : %d, %d 로 두 값은 일치 합니다.\n\n" , textarr, "hello" ); } // 비교 두번째 if (__Text == "hello" ){ printf ( "2. \"hello\"와 define Text 는 같습니다.\n" ); printf ( "주소값 : %d, %d\n\n" , &__Text, "hello" ); } // 비교 세번째 if (__Text == textarr){ printf ( "3-1. define Text 와 textarr 는 같습니다. ( 비교연산자 )\n" ); printf ( "주소값 : %d, %d\n\n" , &__Text, &textarr); } // 비교 세번째 2 if (__Text == text){ printf ( "3-2. define Text 와 text 는 같습니다. ( 비교연산자 )\n" ); printf ( "주소값 : %d, %d\n\n" , &__Text, &text); } else { printf ( "3-2. define Text 와 text 는 같지 않습니다. ( 비교연산자 )\n" ); printf ( "주소값 : %d, %d\n\n" , &__Text, &text); } // 비교 네번째 if ( strcmp (__Text, text) == 0){ printf ( "4. define Text 와 text 는 같습니다. ( strcmp 비교 )\n" ); printf ( "주소값 : %d, %d\n\n" , &__Text, &textarr); } // 비교 다섯번째 if ( strcmp (text, textarr) == 0){ printf ( "5. text 와 textarr 는 같습니다. ( strcmp 비교 )\n" ); printf ( "주소값 : %d, %d\n\n" , &__Text, &textarr); } // 비교 여섯번째 if (text == textarr){ printf ( "text 와 textarr 는 같습니다.\n" ); printf ( "주소값 : %d, %d\n" , &text, &textarr); } else { printf ( "6. ##### 배열 text 와 배열 textarr 는 같지 않습니다. ##### ( 비교 연산자 ) \n" ); printf ( " ##### 이유 : %d, %d\n\n" , &text, &textarr); } // 비교 일곱번째 int __address = ( int )&( "hello" ); if (( int )__Text == __address){ printf ( "7. 문자열은 해당 문자열이 저장된 주소값(숫자)를 이용한 비교를 하게 됩니다..\n\n" ); } system ( "pause" ); return 0; } |
C에서 사용하는 비교 연산자(==)와 스트링 변수속 담겨있는 내용값의 비교를 하는 strcmp가 문자열 비교시 사용될 수 있는데, 각 상황별 비교 연산이 가능한 범위와 비교 일치가 되는 항목별로 나열하였습니다.
실행 결과 (http://ideone.com/b653q8)
비교대상 : #define __Text "hello", 외 스트링 "hello" |
예시중 3-1, 3-2 는 같은 char 배열 주소값을 놓고 상수형 스트링 __Text 와 비교하게 되는데
3-1 은 동일 문자열 판정 3-2는 다른 문자열로 판별 됩니다. 그 이유는 컴파일러의 옵티마이제이션 역할 덕 분이라는데
자세한 내용은 http://stackoverflow.com/questions/690176/c-c-optimization-of-pointers-to-string-constants
같은 의미로 __Text, *textarr, "hello" 결국은 같은 번지에 저장된 같은 스트링을 일컫게 된다는 이유로 1,2 번
또한 위와 같은 결론이 도출됨.
결론 : 포인터를 사용하는 상수 타입의 스트링들(동일 값을 가지는 스트링)은 하나의 주소로 관리하기도 한다. 하지만 정확
한 자원 관리를 확답 할 수 없다면 strcmp 를 써야 하는게 맞다.
'C++' 카테고리의 다른 글
소스 가독성 높이는 방법 (0) | 2013.10.11 |
---|---|
자바 객체의 사용 - NDK (0) | 2012.12.27 |
JNI Basic for NDK -4 (0) | 2012.12.27 |
JNI Basic for NDK -3 (0) | 2012.12.27 |
JNI Basic for NDK -1 (0) | 2012.12.27 |