strcmp

주의사항

주의사항

1. == 연산자로 비교하면 안 됨!

char str1[] = "Hello";
char str2[] = "Hello";

if (str1 == str2)             // ❌ 주소 비교 (항상 false)
if (strcmp(str1, str2) == 0)  // ✅ 내용 비교
왜? str1 == str2는 두 배열의 주소를 비교합니다. 내용이 같아도 주소가 다르면 false입니다. strcmp는 내용을 비교합니다.

2. 대소문자 구분함

strcmp("Hello", "hello")  // 0이 아님! (다름)
strcmp("Hello", "Hello")  // 0 (같음)

대소문자 무시하려면:

// 방법 1: 입력을 소문자로 변환
for (int i = 0; cmd[i]; i++) {
    cmd[i] = tolower(cmd[i]);
}

// 방법 2: strcasecmp 사용 (일부 환경)
if (strcasecmp(cmd, "ON") == 0)

3. 공백/개행 문자 주의

// 시리얼로 "ON\n"이 들어오면
strcmp(cmd, "ON")  // 0이 아님! ('\n' 때문에)

// 해결: 개행 제거
cmd[strcspn(cmd, "\n")] = '\0';

4. 널문자 없는 문자열 주의

char data[5] = {'H', 'e', 'l', 'l', 'o'};  // 널문자 없음!
strcmp(data, "Hello");  // ❌ 위험! 예측 불가
널문자가 없는 문자 배열에 strcmp를 사용하면 예측할 수 없는 결과가 발생합니다!

학생들이 자주 하는 실수

실수 1: == 사용

if (cmd == "ON")           // ❌ 항상 false
if (strcmp(cmd, "ON") == 0) // ✅

실수 2: 반환값 오해

if (strcmp(cmd, "ON"))     // ❌ 다를 때 true (헷갈림!)
if (strcmp(cmd, "ON") == 0) // ✅ 같을 때 true (명확!)

실수 3: 대소문자 무시

// 사용자가 "on" 입력
if (strcmp(cmd, "ON") == 0)  // false! 대소문자 다름

댓글

댓글 본문
graphittie 자세히 보기