0

だから私は疑問に思っていました.NSStringsで満たされた1つのNSArrayを同等のUTF8string値に変換する簡単な方法はありますか?

いくつかのパラメーター構成を NSArray に格納し、(int argv, const char *argv[]) を引数として受け取る関数でそれらを使用したいと考えています。

これを複雑な方法で実装しました

int argc = [gameParameters count];
const char **argv = (const char **)malloc(sizeof(const char*)*argc);
for (int i = 0; i < argc; i++) {
    argv[i] = (const char *)malloc(sizeof(char)*[[gameParameters objectAtIndex:i] length]+1);
    strncpy((void *)argv[i], [[gameParameters objectAtIndex:i] UTF8String], [[gameParameters objectAtIndex:i] length]+1);
}

しかし、私はあまり満足しておらず、メモリをクリーンアップするのは面倒です。

この結果を達成するためのより良い方法を知っていますか?

4

1 に答える 1

1

文字列に非 ASCII 文字が含まれている場合、現在の実装は正しくありません。たとえば、文字列 @"é" (SMALL LETTER E WITH ACUTE) の長さは 1 ですが、UTF-8 シーケンス "C3 A9" は 2 バイトです。あなたのコードは、その文字列に十分なメモリを割り当てません。

(つまり[string length]、UTF-8 表現のバイト数ではなく、文字列内の Unicode 文字の数を返します。)

を使用するstrdup()と、Kevin Ballard が提案したように、この問題が解決されます。

argv[i] = strdup([[gameParameters objectAtIndex:i] UTF8String]);

ただし、文字列の複製が必要かどうかも確認する必要があります。現在の autorelease コンテキストで関数を呼び出す場合は、次のようにすれば十分です。

int argc = [gameParameters count];
const char **argv = (const char **)malloc(sizeof(const char*)*argc);
for (int i = 0; i < argc; i++) {
    argv[i] = [[gameParameters objectAtIndex:i] UTF8String];
}
yourFunction(argc, argv);
free(argv);
于 2013-01-23T08:07:26.187 に答える