2017-02-13 1 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()でもそれができます。

この動作はおそらく正確にではありませんが必要です。

いずれの関数も、あらゆる種類のユニコードエンコードを考慮していません。したがって、返される長さはlength-in-bytesであり、文字数ではありません。

NSString-lengthを使用すると、文字列の長さが必要になります。それを超えて、あなたは何をしようとしていますか?

+0

これは、UTF-8文字列の場合のみです。私はそれを反映するために質問を編集しました。 – meisel

+0

@meisel 'strlen()'は、文字の長さではなくバイト長を与えます。 'memchr()'も同様です。だから、これは本当にあなたが望むものであるとは思われません。文字列をバイトの汎用バッファとして扱いたい場合は、その文字列を 'NSData'に変換するか、バイトを文字列とは別の独立したバッファにコピーします。 – bbum

+0

実際、これはまさに私が欲しいものです。私は最終的に、この文字列はNSStringを作成するために使用される大きな文字列の一部になります。私の戦略は、Objective-Cオブジェクトからバッファーを取り出し、処理し、APIのユーザーのためのNSStringとして再結合します。これは非常に高速であり、UTF-8がどのように動作するかを考える必要はありませんが、ヌルで終了する点が異なります。 – meisel

関連する問題