2013-01-22 22 views
0

所以我想知道,是否有一些快速的方法將一個填充了NSString的NSArray轉換爲等價的UTF8string值?將一個填充了NSString的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); 
} 

,但我不是很滿意,並清理內存是乏味的。

你知道更好的方法來達到這個結果嗎?

+1

您可能會發現'的strdup()'是不是'malloc' +'strncpy'簡單多了(雖然你仍然需要之後清理)。 –

+0

是的,我在我的最終代碼中使用了strdup(https://code.google.com/p/hedgewars/source/browse/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m#132) – koda

回答

1

如果字符串包含非ASCII字符,那麼您當前的實現不正確。例如,字符串@「é」(小寫字母E WITH ACUTE)的長度爲1,但UTF-8序列「C3 A9」的長度爲2個字節。你的代碼不會爲該字符串分配足夠的內存。

(換句話說:[string length]返回的Unicode字符數串,而不是UTF-8表示的字節數中)

使用strdup(),如由凱文巴拉德建議,將解決這個問題:

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

但是你還應該檢查是否需要重複字符串。如果調用在當前的情況下自動釋放功能,以下就足夠了:

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); 
+0

那麼我最後用strdup去了,我只是希望系統庫已經有一些東西可用。謝謝! – koda