2016-11-17 164 views
-8

我有一個1000字節的字符數組。我想將它轉換爲int數組,使char數組的四個元素(每個字節)等於int數組中的一個元素(每個字節)。四個1字節字符到一個4字節int?

e.g.: 
char_array[0] = '0' 
char_array[1] = '9' 
char_array[2] = '2' 
char_array[3] = '8' 

it should be converted to 
int_array[0] = 928 or 0928. 

我應該怎麼做?

+0

是否要將字符轉換爲數字或字節爲整數?你的示例代碼提示前者,你的第一段到後者。也許你只需要'atoi'? –

+1

許多答案可能。你可以把更具體的代碼? – Stargateur

+0

'n = 1000 * 0 + 100 * 9 + 2 * 10 + 1 * 8':顯示您嘗試過的。 –

回答

-1

嘗試下面的代碼:

#include<iostream> 
#include<cstring> 

using namespace std; 

#define CHAR_ARRAY_SIZE 8 

int main() 
{ 
    char charArray[CHAR_ARRAY_SIZE] = {'1', '2', '3', '4', '5', '6', '7', '8'}; 

    int intArray[2]; 
    for(int i = 0; i < CHAR_ARRAY_SIZE/4; i++) { 
     char ch1 = (charArray[4*i+0] - '0'); 
     char ch2 = (charArray[4*i+1] - '0'); 
     char ch3 = (charArray[4*i+2] - '0'); 
     char ch4 = (charArray[4*i+3] - '0'); 

     intArray[i] = ch1*1000 + ch2*100 + ch3*10 + ch4; 
    } 
    cout << "intArray[0] : " << intArray[0] << endl; 
    cout << "intArray[1] : " << intArray[1] << endl; 

    return 0; 
} 
-3

如果所有的字符部件均在數組中連續的,那麼很簡單幹脆先拿ADRESS爲int *像這樣:

char_array[0] = '0' 
char_array[1] = '9' 
char_array[2] = '2' 
char_array[3] = '8' 

int * char_array_to_int = (int *)char_array; 

那麼* char_array_to_int包含您需要的值。

否則,您可以使用位移來填充所需的4個字節的整數。

EDIT

遺憾錯過炭陣列上的報價。

那麼是的,你需要從註釋中指出的數字的ascii表示改變爲數字本身。

+3

你的答案不起作用,你不能將char轉換爲這樣的數字。結果取決於您的字節順序 – Stargateur

+2

無論如何,這會調用未定義的行爲。 – Olaf

0

爲什麼不使用sscanf將您的數組轉換爲int值。如果你想有4個字節char數組轉換成再一個int只需將陣列分成4個字節的塊並掃描他們一個接一個,像這樣:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char char_array[8] = {'0', '9', '2', '8', '1', '2', '3', '4'}; 
    int array_size = sizeof(char_array)/sizeof(char_array[0]); 

    int sizeof_int = sizeof(int); 
    int int_array[array_size/sizeof_int]; 

    char buf[sizeof_int + 1]; 
    for (int i = 0; i < array_size; i += sizeof_int) 
    { 
     memcpy(buf, char_array + i, sizeof_int); 
     buf[sizeof_int] = '\0'; 
     int val = 0; 
     if (sscanf(buf, "%d", &val) == -1) 
      return -1; // return in case scanf returns an error 
     int_array[i/sizeof_int] = val; 
    } 

    for (int i = 0; i < array_size/sizeof_int; i++) 
     printf("%d\n", int_array[i]); 
} 

這將產生

928 
1234 

作爲輸出。


哦順便說一句,因爲你使用的是C風格的陣列,我假設你也想要一個C的解決方案。否則,我會建議使用vector而不是數組。

+0

不能使用scanf,因爲我不是不接受用戶的輸入。另外我正在ARM架構上工作,所以有一些限制,不能使用向量:) – tairon

+0

它是'Sscanf',「字符串scanf」從字符串緩衝區中讀取的,所以它不會從stdin中讀取。只需將四個'chars'複製到一個新的緩衝區中,在它們之後添加一個''\ 0''使其成爲一個有效的字符串,然後嘗試像數字一樣讀取該字符串並將其存儲在新數組中 – muXXmit2X

0

您可以使用strncpy僅在一個臨時字符數組中複製4個字符,然後通過atoi將其轉換爲整數。

char tmp[5]; 
tmp[4] = '\0'; 
for (int i=0; i<250; i++) 
    { 
    strncpy (tmp, &char_array[i*4], 4); 
    int_array[i] = atoi (tmp); 
    } 
+1

這會調用未定義的行爲。 – muXXmit2X

+0

它仍然調用UB。 'atoi'從一個C型字符串中讀取,一個字符數組由''\ 0''結尾。由於您的數組長度爲4個字節,並且將4個字節複製到其中,所以不能保證字符串正確終止,並且atoi將文字掃描整個內存直到找到「\ 0」。 – muXXmit2X

+0

@ muXXmit2X你是對的。編輯。 –

1

對於數組中的每個字符,數字添加到我們正在構建的價值。 (我們事先乘以10來調整數字)。

每4位數字,加入整數數組並重置該值。

int value = 0; 
for (i = 0; i < 1000; i++){ 
    value *= 10; 
    value += char_array[i] - '0' 
    if(i % 4 == 3){ 
     int_array[i/4] = value; 
     value = 0; 
    } 
} 

注意,如果CHAR_ARRAY包含比數字0-9其他字符,但這是任何簡單的檢查,以補充這是不行的。

相關問題