2017-02-13 8 views
1

strlen 대신 memchr을 사용하여 NSString의 배킹 문자열로 잠재적으로 사용되는 C 문자열의 길이를 찾고 싶습니다. 이 작업이 안전합니까? 아니면 내가 소유하지 않은 메모리를 읽을 위험이 있습니까? 충돌이 발생 했습니까? NSString이 내부 버퍼로 끝나기 전에 해제되지 않는다고 가정 해 봅시다.NSString에서 반환 된 내부 UTF-8 char *와 함께 memchr을 안전하게 사용할 수 있습니까?

+1

포인터가 유효하면 안전하지 않을 수 있습니다. 하지만 어려운 질문은 'NSString'에서 가져 오지 않으면 포인터가 해제 된 시점을 쉽게 알 수 없다는 것입니다. 그러면'length '를 호출해야합니다. –

+1

관련 항목 : http://stackoverflow.com/questions/ 29473872/lifespan-of-nsstring-cstringusingencoding-return-value. –

+1

문자열에'-length'를 직접 호출하지 않는 이유는 무엇입니까? –

답변

1

memchr(s, 0, XXX)strlen(s)은 거의 동일하게 동작해야하며, mechr()의 XXX 바이트 이후 종료 기능은 제외됩니다. 그러나 strnlen()도 그렇게 할 수 있습니다.

그 행동은 아마도 정확히 이 아니며이 필요합니다.

어느 기능도 모든 종류의 유니 코드 인코딩을 설명하지 않습니다. 따라서 리턴 된 길이는 문자의 길이가 아닌 바이트의 길이가됩니다.

문자열 길이를 원할 경우 NSString-length을 사용하십시오. 너는 무엇을하려고 하는가?

+0

이것은 UTF-8 문자열 전용입니다. 나는 그것을 반영하기 위해 질문을 편집했다. – meisel

+0

@meisel'strlen()'은 문자 길이가 아닌 바이트 길이를 제공합니다. 'memchr()'도 그렇게 될 것입니다. 그래서, 다시 말하지만, 이것이 정말로 당신이 원하는 것일 것 같지 않습니다. 문자열을 제네릭 버퍼의 바이트로 취급하려면 문자열을 NSData로 변환하거나 문자열을 별도의 버퍼로 복사하십시오. – bbum

+0

사실, 이것이 제가 원하는 것입니다. 결국,이 문자열은 NSString을 만드는 데 사용되는 큰 문자열의 일부가됩니다. 내 전략은 Objective-C 객체에서 버퍼를 가져 와서 처리하고 API 사용자를위한 NSString으로 재결합하는 것입니다. 그것은 매우 빠르며 UTF-8이 어떻게 작동하는지 생각할 필요가 없습니다. – meisel