2011-01-17 22 views
7

Mam tablicę liczb całkowitych, powiedzmy int example[5] = {1,2,3,4,5}. Teraz chcę przekonwertować je do tablicy znaków za pomocą C, a nie C++. Jak mogę to zrobić?Konwertuj tablicę int na tablicę znaków

+2

Co 1,2,3,4,5 oznaczają? Jakie są uzasadnione konwersje, których się spodziewasz? Dodaj przykład do swojego pytania. – Aamir

+0

możesz użyć sprintf – Marii

+0

To jest literówka ... jej int example [5] – Allwyn

Odpowiedz

8

W zależności od tego, co naprawdę chcesz, istnieje kilka możliwych odpowiedzi na to pytanie:

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

Prosto kopiowania znaki sterujące dając ASCII 1 - 5

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

znaków '1' - „5 "

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

ciągów reprezentujących 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

Co się stanie, jeśli liczba całkowita jest większa niż "9"? Liczby całkowite powyżej "10" nie zostaną zamienione na format char. – Stallman

1

Można konwertować jednocyfrowy liczbą całkowitą do odpowiedniego charakteru, używając tego wyrażenia:

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

Należy pamiętać, że to jest ważne tylko, oczywiście, dla pojedynczych cyfr. Ekstrapolowanie powyższych do pracy przeciwko tablicom powinno być proste.

0

Musisz utworzyć tablicę, ponieważ sizeof(int) jest (prawie na pewno) inny niż sizeof(char)==1.

Masz pętlę, w której można wykonać char_example[i] = example[i].


Jeśli to, co chcesz, jest konwertować liczbę całkowitą na łańcuch może po prostu podsumować swoją całkowitą do '0' ale tylko jeśli jesteś pewien, że jest liczbą całkowitą z przedziału od 0 do 9, w przeciwnym razie trzeba używać bardziej wyrafinowanych, takich jak 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; 
} 

Wyjścia:

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

Twoja odpowiedź będzie działać tylko dla numerów do 999, po których rozpocznie się obcięcie cyfr - INT_MAX dla liczby całkowitej wynoszącej 32 bitów 2 to 2147483647, które mają raczej więcej niż 3 cyfry (jedna z twoich jest zajęta z ''\ 0 '') – JeremyP

+0

@JeremyP Rozumiem, co masz na myśli, dziękuję. – karlphillip

0

W czystym C zrobiłbym to tak:

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

Odlew malloc nie jest "czystym C", jego C++. – user411313

Powiązane problemy