2014-02-24 7 views
0

strnlen() 기능은 여러 가지 주목할만한 라이브러리에 잠시 추가되었으며 이후에 POSIX-1:2008과 같은 표준으로 변경되었습니다. IIUC의 목적은 제목 문자열이 끝이 아닌 경우 문제를 피하는 것입니다.왜 strnspn()도 strncspn()도 없습니까?

그러나 이와 유사한 잠재적 문제가 제기 될 수도 있음에도 불구하고 유사한 변형이 개발 된 것으로 보이지 않습니다. 베이스가 strspn()strcspn()이 많은 C 프로그래머의 이해를 넘어서서 사용되지 않거나 사용할 수없는 것으로 가정 되었기 때문입니까?

하나는 유명한 "보안이 강화 된"문자열 함수의 변종 (별관-K 또는 M's-확장 일명)가 더 strcspn_s()strspn_s() 중 하나 없습니다 ... (에)

+0

제 생각에는 이러한 제안 된 함수는 memspn() 및 memcspn()이라고해야합니다. memcpy()와 memcmp() 및 memmem()에 맞춰 유지하십시오. – wildplasser

+0

@wildplasser : 흥미 롭습니다. 's1'을위한'void *'(+ count)의 혼합에도 불구하고 여전히'char *'이 될's2'와 반대되는 것으로 생각됩니다. 또한 s2의'\ 0 '을 종료하는 것이 * span *의 일부로 간주 될 수 있기 때문에'memspn()'에 더 적합하지만'memcspn()'에서는 덜 분명합니다. – AntoineL

+2

@wildplasser :'mem *'함수는 지정된 바이트 수에 도달하면 종료되고 '\\'문자는 특별히 처리하지 않습니다. 'strn *'함수는 지정된 바이트 수 * 또는' '\ 0'종결자가 도달하면 종료됩니다 (대부분, ['strncpy'] (http : //the-flat-trantor-society.blogspot .com/2013/12/where-should-control-key-be.html)은 다소 혼란 스럽습니다. –

답변

0
에있는 것을 알 수 있습니다

표준 라이브러리에 특정 기능이 나타나지 않는 이유에 대한 대답은 "모든 구현에서 제공해야하는 것을 정당화 할 필요가 있다고 말하는 충분한 사람들이 없었습니다. 필요할 경우 항상 작성할 수 있습니다. 출판 된 많은 버전 중 하나를 사용하십시오. "

모든 것을 추가 할 수는 없습니다. 어느 시점에서 일을자를 위치에 대한 임의의 결정이 내려집니다.

0

strnlen()이 있으면 strspn()에서 사용하기 전에 먼저 문자열을 온 전성 검사하는 것이 상대적으로 쉽습니다.

strspn()는 일반적으로 더 적은) (나 strlen보다 사용

strspn()이 개 문자 * 인수를, 그리고 일반적으로 그냥 길이 보호를 필요 첫 번째 문자열이 될 것이기 때문에, 여부의 질문을이 두 번째 함수는이 함수의 길이 제한을 가져야한다.

+0

첫 번째 요지에 동의하지 않습니다 : 제목 문자열에 오버런을 피할 진정한 필요가 있다면 IMHO'strnlen()'이 정답이 아닙니다. 문자열의 종료에 문제가 있다는 표시가 있지만'\ 0'이 아닌 문자열에'strspn()'의 동작을 수행하는 직접적인 방법이 없으므로이 특별한 경우를 코딩하는 것을 끝냅니다 . 그렇게하기보다는 처음에는'strnspn()'을 코딩하는 것이 더 쉽습니다. 즉 문자열이 "너무 멀리"갈 때 문자열을 통해 검색을 중지하는 것이 더 쉽습니다. 다른 두 점은 유효합니다. – AntoineL

+0

네, null 종결되지 않은 배열의 경우에도 마찬가지입니다. 그러나 null 종결이되는 문자열의 견고 함을 위해 다음과 같이 쉽게 할 수 있습니다. if (strnlen (buffer, BUFFER_LEN) = = BUFFER_LEN) 버퍼 [BUFFER_LEN-1] = 0; – sj0h