2012-08-06 23 views
0

我有,我想存儲這樣1203如何存儲零陣列數據用C

char* arr= new char[10]; 
    arr[0] = 1; 
    arr[1] = 2; 
    arr[2] = 0; 
    arr[3] = 3; 

值數組,但存儲0後我不能夠看到任何進一步的數據BCS它會考慮作爲數據的結束。有什麼辦法來管理這?

+3

爲什麼使用字符來存儲整數? – 2012-08-06 09:15:09

+2

請發佈您用於讀取/處理數據的代碼。聽起來就像你在使用字符串函數。 – Mat 2012-08-06 09:15:35

+1

如果您的數據總是整數,則使用整數數組。通過使用字符數組,「0」是空終止符。 – 2012-08-06 09:16:01

回答

1

0意味着在char*字符串的結尾。

因爲char*是C中的一個字符串,它存在被用作char數組而不是integer數組。與字符串相關的所有函數都用於字符串。您可以使用int*來存儲integer s。

您可以手動執行二進制操作是這樣的:

int value = 1245; 

char* temp = new char[4]; 

temp[0] = (char)(value >> 24); 
temp[1] = (char)(value >> 16); 
temp[2] = (char)(value >> 8); 
temp[3] = (char)value; 

return temp; 

可以使用uint8_tint,而不是char

(char*)((int)value)並不好,因爲你投的intchar*,但char*將被存儲在temp變量temp數量不限。

如果指針是你一個新的東西,這將有助於做一些練習指針:操作數組,列表,...

+0

來自CppDepend:對不起,它只返回00即我認爲只有1字節 – poppy 2012-08-06 11:26:27

+0

@poppy:你只需要1個字節?我糾正了我的答案。你想要一個從0到255的字節或從-127到128的一個字節? – 2012-08-06 11:33:37

+0

不,我不希望只有一個字節的值爲1245期望值是[0,0,4,-35]即000004dd,但我認爲我只獲得第一個值 – poppy 2012-08-06 11:37:48

2

您正在將整數存儲在字符數組中。嘗試是這樣的:

char* arr= new char[10]; 
arr[0] = '1'; 
arr[1] = '2'; 
arr[2] = '0'; 
arr[3] = '3'; 
+3

請不要忘記終結者,否則你會看到更多。 – 2012-08-06 09:17:12

+0

對不起,我正在嘗試轉換的實際代碼是這樣的在Java中:'\t返回新的字節[] { \t \t \t(字節)(值>>> 24), \t \t \t(字節)(值>>> 16), \t \t \t(字節)(值>>> 8), \t \t \t(字節)值};'其中值是INT。 – poppy 2012-08-06 09:31:38

+0

@ Aamir,@ Eric Postpischil,@ Gamecat:我已經寫過這樣的值1245; char * temp = new char [4]; \t \t溫度=((字符*)((int)的值>> 24), \t \t \t \t(字符*)((int)的值>> 16), \t \t \t \t(字符*)(( int)value >> 8), \t \t \t \t(char *)((int)value));返回溫度;在Java中它會返回0,0,4,-45但我沒有得到任何價值。 – poppy 2012-08-06 09:43:17

0

我想你應該把它寫成:

char* arr= new char[10]; 
arr[0] = '1'; 
arr[1] = '2'; 
arr[2] = '0'; 
arr[3] = '3'; 

,這樣當由阿米爾

2

說你不需要使用零值指示終止你的語法是C++。但是,無論是,你可以使用snprintf來存儲你的數據:

snprintf(arr, 10, "%d", 1203); 
0

你的調試工具,因爲多數,將採取注意到它會顯示一個字符數組。來自數據的數據通常在C中用作空字符串存儲。

以空字符結尾的字符串,如果該名字不夠透露,則是一串字符(可打印或不可打印),以零結束。這個標記告訴printf和什麼時候停止打印。

它還告訴調試器用來停止打印的功能。爲了避免這種情況,你應該告訴你的調試器「這不是一個字符串,傻瓜!」或者簡單地重新聲明爲短。

你接縫是一個首發,所以採取這個建議:忘掉整數,使用短或長。 int的大小取決於機器,它會讓你進入「我假設它是Xbits」的麻煩。

+1

我會贊成,但我不會因爲「使用短或長期」。短褲和長褲也依賴於機器。 int是一個很好的默認類型。 – Suma 2012-08-06 09:26:34

+0

@Suma,也許你在想一個詞。總是16bit,Long總是32bit,Long long總是64bit。 – jpinto3912 2012-08-07 12:52:39

+0

讓我們把它變得更有趣吧:給我們一個編譯器的例子,它沒有實現2B中長度爲4B,長爲8B,長爲4B的長度。我會吃我的帽子。 – jpinto3912 2012-08-07 12:58:19

0

你可以在Unix平臺上使用寫:

man 2 write; 

此功能允許您指定元素的長度進行打印。

但是當然,snprintf是一個便攜式解決方案(因爲size_t大小允許你這樣做)。

這樣做要小心,以免發生段錯誤。

注: 可以設置字符與價值像0255,或負值,如果它是一個signed char ... 你可以用0設置,或與48,沒有差別。

1

你說你「無法看到任何進一步的數據」,但是你沒有描述你正在做什麼來查看數據。你用printf和%s格式打印它嗎?你在調試器中顯示它嗎?

當您對char數據使用字符串操作時,零通常表示字符串的結尾。在printf中使用%s或使用strcpy或strlen時,這是真的。但是,可以用數字處理一個char數組。在arr[3] = 3;之後,3被存儲在arr [3]中,這只是看到它的問題。

通過在printf中使用%d格式,可以將十進制數字打印爲char數據。 %d打印一個數字,所以你需要傳遞一個數字來打印,比如arr [0],arr [3],或者在一個循環中,arr [i]。這與%s不同,在這裏你向printf傳遞一個指針(比如數組,它成爲第一個元素的指針),並且它會打印多個字符。

如果您正在用調試器查看char數組,您可能會單獨查看arr [3]以查看它是否包含3.您的調試器可能有一種方法來顯示char數組作爲十進制序列數字而不是字符串。

+0

:我寫了這樣的值1245; char * temp = new char [4]; temp(char *)((int)value >> 24),(char *)((int)value >> 16),(char *)((int)value >> 8),(char *) (INT)值));返回溫度;在Java中它會返回0,0,4,-45但我沒有得到任何價值。 – poppy 2012-08-06 09:46:32

0

char * arr = new char [10];

因爲您已經定義了字符數組,當您將0賦給任何數組成員並傳遞整個數組或打印數組時,它將其作爲數據結束的原因是因爲0實際上是NULL,並且每個字符串都以空值。所以如果你真的想分配字符0的值,那麼你可以分配ascii值0或'0'。

希望它有助於

+0

:謝謝,但正如你所建議的,如果我存儲這樣的'0',那麼它將它存儲爲「\ x30」整個值x0 x04 x30 x30。 – poppy 2012-08-06 10:20:38