2016-11-17 92 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其他字符,但这是任何简单的检查,以补充这是不行的。

相关问题