2011-01-17 74 views
7

Tôi đang có một mảng số nguyên nói int example[5] = {1,2,3,4,5}. Bây giờ tôi muốn chuyển đổi chúng thành mảng ký tự bằng cách sử dụng C, không phải C++. Tôi làm nó như thế nào?Chuyển đổi mảng int thành mảng char

+2

gì 1,2,3,4,5 đứng cho? Một số chuyển đổi hợp lý bạn đang mong đợi là gì? Vui lòng thêm ví dụ cho câu hỏi của bạn. – Aamir

+0

bạn có thể sử dụng sprintf – Marii

+0

Đó là một lỗi đánh máy ... ví dụ int của nó [5] – Allwyn

Trả lời

8

Tùy thuộc vào những gì bạn thực sự muốn, có rất nhiều câu trả lời cho câu hỏi này:

int example[5] = {1,2,3,4,5}; 
char output[5]; 
int i; 

bản sao Straight ký tự điều khiển cho ASCII 1 - 5

for (i = 0 ; i < 5 ; ++i) 
{ 
    output[i] = example[i]; 
} 

ký tự '1' - '5 '

for (i = 0 ; i < 5 ; ++i) 
{ 
    output[i] = example[i] + '0'; 
} 

chuỗi đại diện 1 - 5.

char stringBuffer[20]; // Needs to be more than big enough to hold all the digits of an int 
char* outputStrings[5]; 

for (i = 0 ; i < 5 ; ++i) 
{ 
    snprintf(stringBuffer, 20, "%d", example[i]); 
    // check for overrun omitted 
    outputStrings[i] = strdup(stringBuffer); 
} 
+1

Nếu số nguyên lớn hơn '9' thì sao? Số nguyên trên '10' sẽ không được chuyển đổi sang định dạng char. – Stallman

1

Bạn có thể chuyển đổi một đơn chữ số-số nguyên vào nhân vật tương ứng sử dụng biểu thức này:

int intDigit = 3; 
char charDigit = '0' + intDigit; /* Sets charDigit to the character '3'. */ 

Lưu ý rằng đây chỉ là hợp lệ, tất nhiên, đối với một con số. Ngoại suy ở trên để làm việc chống lại mảng nên được thẳng về phía trước.

0

Bạn cần tạo mảng, vì sizeof(int) là (gần như chắc chắn) khác với sizeof(char)==1.

Có vòng lặp mà bạn làm char_example[i] = example[i].


Nếu những gì bạn muốn là để chuyển đổi một số nguyên vào một chuỗi bạn chỉ có thể tổng hợp số nguyên của bạn để '0' nhưng chỉ khi bạn chắc chắn rằng số nguyên của bạn là từ 0 đến 9, nếu không bạn sẽ cần sử dụng một số tinh vi hơn như sprintf.

2
#include <stdio.h> 

int main(void) 
{ 
    int i_array[5] = { 65, 66, 67, 68, 69 }; 
    char* c_array[5]; 

    int i = 0; 
    for (i; i < 5; i++) 
    { 
     //c[i] = itoa(array[i]); /* Windows */ 

     /* Linux */ 
     // allocate a big enough char to store an int (which is 4bytes, depending on your platform) 
     char c[sizeof(int)];  

     // copy int to char 
     snprintf(c, sizeof(int), "%d", i_array[i]); //copy those 4bytes 

     // allocate enough space on char* array to store this result 
     c_array[i] = malloc(sizeof(c)); 
     strcpy(c_array[i], c); // copy to the array of results 

     printf("c[%d] = %s\n", i, c_array[i]); //print it 
    } 

    // loop again and release memory: free(c_array[i]) 

    return 0; 
} 

Đầu ra:

c[0] = 65 
c[1] = 66 
c[2] = 67 
c[3] = 68 
c[4] = 69 
+0

Câu trả lời của bạn sẽ chỉ hoạt động với số lên tới 999, sau đó nó sẽ bắt đầu cắt xén chữ số - INT_MAX cho số nguyên bổ sung 32 bit 2 là 2147483647, thay vì nhiều hơn 3 chữ số (một trong bốn số của bạn được lấy bằng ''\ 0 '') – JeremyP

+0

@ JeremyP Tôi hiểu ý của bạn là gì, cảm ơn bạn. – karlphillip

0

Trong C tinh khiết Tôi sẽ làm điều đó như thế này:

char** makeStrArr(const int* vals, const int nelems) 
{ 
    char** strarr = (char**)malloc(sizeof(char*) * nelems); 
    int i; 
    char buf[128]; 

    for (i = 0; i < nelems; i++) 
    { 
     strarr[i] = (char*)malloc(sprintf(buf, "%d", vals[i]) + 1); 
     strcpy(strarr[i], buf); 
    } 
    return strarr; 
} 

void freeStrArr(char** strarr, int nelems) 
{ 
    int i = 0; 
    for (i = 0; i < nelems; i++) { 
     free(strarr[i]); 
    } 
    free(strarr); 
} 

void iarrtostrarrinc() 
{ 
    int i_array[] = { 65, 66, 67, 68, 69 }; 
    char** strarr = makeStrArr(i_array, 5); 
    int i; 
    for (i = 0; i < 5; i++) { 
     printf("%s\n", strarr[i]); 
    } 
    freeStrArr(strarr, 5); 
} 
+0

Một malloc-cast không phải là 'pure C', C++ của nó. – user411313

Các vấn đề liên quan