2013-03-13 41 views
0

我有一個c字符串,需要它將它分解成行(我不會在此刻創建它們的NSString)。 有沒有像我可以把這個char *的NSMutableArray的東西? 或者我怎樣才能實現它從字符串中創建我可以通過索引訪問的內容?在目標c中的char *數組

目前我做

char *cline = strtok(data, "\n"); 
      while(cline) 
      { 
... 
} 

或者是更容易待辦事項這個時候我從磁盤中讀取文件?

+1

你可以在普通的C使用任何類型的,你可以在Objective-C使用。 – 2013-03-13 20:22:48

+0

而且你可以使用NSPointerArray。或者有一個非對象的封裝對象,其名稱我現在不記得。 (啊,是--NSValue。) – 2013-03-13 20:27:20

+0

你可以使用NSValue,但是來回轉換char會產生很多開銷。爲什麼不用calloc使用c指針並在需要時增加數組呢?不幸的是沒有Obj-c容器可以存儲原始的c類型。 – HermioneGreen 2013-03-13 20:28:27

回答

1

使用NSValue來存儲你的char *在一個NSMutableArray

概述

一個NSValue對象是單一的C或Objective-C的數據項的簡單容器。它可以包含任何標量類型,如int,float和char,以及指針,結構和對象標識符。此類的目的是允許將這些數據類型的項添加到集合中,例如NSArray和NSSet的實例,這些集合要求它們的元素是對象。 NSValue對象總是不可變的。

+1

無需創建一個類;只是使用NSValue。 – bbum 2013-03-13 20:23:12

+0

啊,也許多數民衆贊成我在想什麼。你NSValue應該做的伎倆 – Fonix 2013-03-13 20:26:17

+0

非常感謝你!當數組被釋放時,NSValue是否釋放指針? – Sebastian 2013-03-13 20:31:24

1

您不能將C/C++指針插入到NSMutableArray中,除非它包裝在像NSValue或其他Objective-C類的容器中。

如果你想要一個NSMutableArray,把它轉換成一個NSString就會容易多了。

NSArray* strings = [[NSString initWithCString:data encoding:NSUTF8StringEncoding] componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]]; 

您的其他選擇,如果您嚴格想要留在C/C++領域將有一個字符串或char *數組的向量。

1

正如其他人已經指出的,爲了將諸如a之類的原始C類型存儲在諸如NSMutableArray的實例之類的Obj-C對象中,您需要首先將它們包裝在NSValue對象中。

作爲替代方案 - 如果您想在Obj-C中使用純C字符串,請不要忘記您可以自由地將C與Objective-C源代碼混合,因此使用正常的C數組一個完全合法的解決方案。

通過將這些值包裝到一個obj-c數組中,您可以獲得邊界檢查和可變性,但是如果您繼續展開值作爲C字符串處理它們,則可能更好地使用普通的舊C字符串首先,節省開銷。

然後,如果您想使一個NSString,你可以簡單地使用NSString便捷方法stringWithFormat:,像這樣:

char str[50]; 

// read characters into the buffer from a file... 

// When done, convert to an NSString: 
NSString *string = [NSString stringWithFormat:@"%s", str]; 
+0

我測試了這個。它不起作用。試試NSString * string = [NSString stringWithFormat:@「%@」,str]; – Frank 2014-02-06 04:02:39