주의사항
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! 대소문자 다름

