73.7 심사문제의 답
, 박 지영님이 작성73.7 심사문제에서
int compare(const void *a, const void *b)
{
int c;
c = strcmp((char *)a, (char *)b);
if (c == -1)
return 1;
if (c == 1)
return -1;
return 0;
}
이렇게 해도, 해결이 되는거 같은데 오답으로 취급되더라구여
당연히, 기본 답이 간결하고 편리한건 알겠지만
이 답도 가능한게 아닌가 싶어 문의드립니다.
회신: 73.7 심사문제의 답
, 도장_ 관리자님이 작성온라인 심사는 리눅스 환경에서 실행되고 있습니다.
Unit 41.2를 보면 설명하고 있지만, 리눅스/macOS 환경에서는 strcmp 함수가 반환하는 값이 다릅니다.
Visual Studio에서는 1과 -1을 반환하지만, 리눅스 환경에서는 두 문자의 ASCII 코드 값 차이를 반환합니다. 따라서 > 0 또는 < 0인 숫자를 반환합니다.
문의한 코드는 Windows 플랫폼, Visual Studio에서만 실행됩니다. Windows, Linux, macOS 플랫폼에서 모두 실행되고, Visual Studio, GCC에서 모두 동작하는 코드를 작성하고 싶다면 == 1 대신에 > 0으로 작성하고, == -1 대신에 < 0으로 작성해야 합니다.
Unit 41.2의 예제 string_scanf_compare_linux_osx.c에서도 > 0과 < 0으로 조건문을 작성하고 있습니다.
Unit 41.2를 보면 설명하고 있지만, 리눅스/macOS 환경에서는 strcmp 함수가 반환하는 값이 다릅니다.
한 가지 주의할 점이 있는데 strcmp 함수는 운영체제에 따라서 동작 방식이 조금 다르다는 점입니다. Windows(Visual Studio)에서는 문자열이 다르면 1과 -1을 반환하지만 리눅스와 OS X에서는 ASCII 코드값의 차이를 반환합니다. 그러므로 리눅스와 OS X에서 strcmp의 반환값을 판단할 때는 switch 분기문 대신 if 조건문을 사용해야 합니다.예제 string_scanf_compare_linux_osx.c를 참고하세요.
Visual Studio에서는 1과 -1을 반환하지만, 리눅스 환경에서는 두 문자의 ASCII 코드 값 차이를 반환합니다. 따라서 > 0 또는 < 0인 숫자를 반환합니다.
문의한 코드는 Windows 플랫폼, Visual Studio에서만 실행됩니다. Windows, Linux, macOS 플랫폼에서 모두 실행되고, Visual Studio, GCC에서 모두 동작하는 코드를 작성하고 싶다면 == 1 대신에 > 0으로 작성하고, == -1 대신에 < 0으로 작성해야 합니다.
Unit 41.2의 예제 string_scanf_compare_linux_osx.c에서도 > 0과 < 0으로 조건문을 작성하고 있습니다.