2009-10-11 5 views
0

R C 도서에서 K-& 연습 5-4를하려고합니다. 나는 strncpy와 strncat에 대한 메소드를 작성했지만, strncmp 부분에 대해 정확히 무엇을 리턴해야 하는지를 정확히 이해하고있다.strncmp C 연습 문제

(K & R 책의 부록 B에서) strncmp의 정의는 다음과 같습니다

은 문자열 t에 문자열의 대부분의 n 문자에 비교; < 0의 경우 <톤, 0의 경우 ==의 t, 또는 > 경우는 0을 반환의 >t

내가 3 개 문자열이 있다고 가정하자 :

char s[128] = "abc" 
char t[128] = "abcdefghijk" 
char u[128] = "hello" 

을 그리고 나는를 사용하여 비교하려는 strncmp 함수 작성해야합니다. 나는 그것을 알고있다

strncmp(s, t, 3) 

는 abc == abc이기 때문에 0을 반환한다. 내가 혼란스러워하는 곳은 다른 비교들입니다. 예를

strncmp(s, t, 5) and 
strncmp(s, u, 4) 

첫 번째는 제 3 회 위치를 일치하고 그 후에 더 이상 일치하지 두 번째 예는 전혀 일치하지 않는하십시오.

정말 2 가지 비교 결과가 무엇인지 알기를 바랍니다. 그래서 왜 strncmp의 버전을 작성하고 연습을 마칠 수 있는지 알고 싶습니다.

+3

strncmp를 호출하는 프로그램을 작성할 수없는 이유가 있습니까? –

+0

나는 프로그램을 만들었지 만 돌아온 값이 왜 돌아 왔는지 이해하지 못했습니다. 대답을 아는 것이 왜 그 대답인지 아는 것만 큼 중요합니다. 나는이 개념을 정말로 이해하고 싶다. – Koby

+0

당신의 질문이 말하는 것은 아닙니다. "나는 그 두 가지 다른 비교가 무엇을 반환 하는지를 정말로 알고 싶습니다."라고 말합니다. –

답변

2

두 가지 모두 음수를 반환합니다 (문자 순서 만 사용하여 비교). 방금 테스트를 해본 결과 내 컴퓨터에서 마지막 비교 문자의 차이가 반환됩니다. 따라서 :

strncmp(s, t, 5) = -100 // '\0' - 'd' 
strncmp(s, u, 4) = -7 // 'a' - 'h' 

그게 뭡니까?

+0

종류, 그렇습니다. 나는 답을 아는 것이 아니라 왜 strncmp (s, t, 5) = -100인지 또는 strncmp (s, u, 4) = -7인지 이해하는 데 더 많은 관심이 있습니다. 답을 알고있는 것이 좋지만 그 이유는 무엇입니까? – Koby

+0

나는 대답에서 그것을 썼다. 그것은 주석이 말하는 것이다. 'a'- 'h'= -7이므로이 함수는 -7을 반환합니다. –

+0

마찬가지로, null 문자 ('\ 0')에서 'd'를 뺀 값은 -100이므로 응답의 출처가됩니다. –

1

왼쪽에서 오른쪽으로 문자열이 알파벳 순서로 비교됩니다.

그래서 ABC < ABCDEFGHIJK < 헬로

strncmp (S, t, 5) = -1 strncmp (S, t, 5) = -1 제 일치하지 않는 위치에

+0

-1을 반환하는 것이 의미 상으로 올바르다 고 생각하지만, 로컬 구현이하는 것은 아닙니다. (Mac OS X 10.6.1) –

+0

요구 사항은 '<0'입니다. '-100'과 '-1'모두 0보다 작으므로 둘 다 정확합니다. 일반적인 트릭은 차이가 발견 된 지점에서 's1 [i] - s2 [i]'를 반환하는 것입니다. –

+0

@Jonathan은 로컬 구현이 어떻게 작동하는지 설명하고 있으며, 작성하는 것이 빠른 방법 인 것 같습니다. –

2

문자 unsigned char으로 변환 된 다음 숫자로 비교됩니다. s1의 해당 문자가 s2의 해당 문자보다 작 으면 음수가 반환됩니다. 더 큰 경우 양수가 반환됩니다.

1
strncmp 대한 계약 그 서명의 비교 결과를 나타내는 정수 값을 반환하는 것이다

:

  • 음의 값이 1 피연산자로서 비교 한 것을 나타낸다 "를 이하"제 2 피연산자
  • 양수의 0이 아닌 값은 첫 번째 피연산자가 두 번째 피연산자보다 "더 큼"과 비교한다는 것을 나타내며
  • 0은 두 피연산자가 서로 "동일"하다고 비교 함을 나타냅니다.

오히려 말,보다, 그런 식으로 정의되어 이유는, "-1을 반환은"보다 ", 0은"같음 "을위한 일"구현을 제한하지 않는 것입니다 "보다 크다.

. 특정 C 런타임 라이브러리 반환

값은 기능이 구현되는 방법에 달려있다 POSIX의 사양 (표준 C를 추적하는) strncmp() 대 (IEEE 1003.1)를 말한다

strncmp() 함수 은 0 바이트 (0보다 큰 바이트는 비교되지 않음)를 비교하지 않아야한다. s1이 가리키는 배열은 s2가 가리키는 배열을 가리 킵니다.

0이 아닌 반환 값의 부호는 비교되는 문자열에서 다른 첫 번째 바이트 쌍 (모두 부호없는 유형 char로 해석 됨)의 값 사이의 차이 의 부호로 결정됩니다.

구현하기 위해 알아야 할 모든 것입니다. 그래도 다음과 같이 유의해야합니다.

  • strncmp()은 버퍼 오버 플로우가 발생할 수 있다는 점에서 "안전하지"않습니다. 적절한 구현은 ASCII NUL을 만나거나, 최대 길이에 도달하거나, 보호 된 메모리에 액세스하려고 시도 할 때까지 문자를 유쾌하게 비교합니다.
  • 부호의은 반환 값의 첫 번째 쌍 사이의 델타를 기준으로합니다. 특별한 반환 값은 요구되지 않는다.

행운을 빈다.