2009-02-05 11 views
6

Je suis en train de convertir un nombre entier en C dans un tableau contenant chacun que les chiffres du nombreconvertir un nombre entier dans un tableau

à savoir si j'ai

int number = 5400 

comment puis-je à

int numberArray[4] 

numberArray[0] = 0; 
numberArray[1] = 0; 
numberArray[2] = 4; 
numberArray[3] = 5; 

Toute suggestion reçue avec gratitude.

Répondre

13

Cela fonctionnerait pour les nombres> = 0

#include <math.h> 

char * convertNumberIntoArray(unsigned int number) { 
    int length = (int)floor(log10((float)number)) + 1; 
    char * arr = new char[length]; 
    int i = 0; 
    do { 
     arr[i] = number % 10; 
     number /= 10; 
     i++; 
    } while (number != 0); 
    return arr; 
} 

EDIT: Juste un peu plus de style C mais plus cryptique.

#include <math.h> 

char * convertNumberIntoArray(unsigned int number) { 
    unsigned int length = (int)(log10((float)number)) + 1; 
    char * arr = (char *) malloc(length * sizeof(char)), * curr = arr; 
    do { 
     *curr++ = number % 10; 
     number /= 10; 
    } while (number != 0); 
    return arr; 
} 
+0

Pourquoi cette fonction est-elle un pointeur char? Et que fait le nouveau caractère [longueur]? Cela ressemble à un pointeur sur le premier index du tableau, mais mon compilateur ne semble pas aimer 'new char' – droseman

+0

'new char' est C++ speak. La bonne façon de le faire en C est le deuxième bit de code. –

+0

Aussi, il est important qu'à la fin de votre programme, vous appeliez 'free()' sur n'importe quel tableau de cette fonction. Sinon, vous perdez de la mémoire. –

5

Indice: Jetez un oeil à cette question précédente "Sum of digits in C#". Il explique comment extraire les chiffres du numéro à l'aide de plusieurs méthodes, certaines pertinentes en C.

De Greg Hewgill's answer:

/* count number of digits */ 
int c = 0; /* digit position */ 
int n = number; 

while (n != 0) 
{ 
    n /= 10; 
    c++; 
} 

int numberArray[c]; 

c = 0;  
n = number; 

/* extract each digit */ 
while (n != 0) 
{ 
    numberArray[c] = n % 10; 
    n /= 10; 
    c++; 
} 
1

Déterminer le nombre de chiffres est délicate, mais en supposant qu'il est toujours 4 chiffres, vous pouvez ne:

for (i = 0; i < 4; i++) { 
    numberArray[i] = number%10; 
    number = number div 10; 
} 
+1

En C, il est appelé/non div. –

+0

Non, le nombre de chiffres est facile. Il suffit d'utiliser log10 (a) + 1. – vava

+0

dans certains cas, ce serait certainement évaluer à la valeur incorrecte? par exemple. log10 (50) +1 = 2,70 = 3 en tant qu'entier. – droseman

0

Code C:

/* one decimal digit takes a few more than 3 bits. (2^3=8, 2^4=16) */ 
int digits[(sizeof (int) * CHAR_BIT)/3 + 1], 
    *digitsp = digits; 
do { 
    *digitsp++ = number % 10; 
    number /= 10; 
} while(number > 0); 

Vous verrez comment vous avez converti en prenant la différence

digitsp - digits 

de chiffres Si vous voulez le mettre en fonction:

#define MIN_DIGITS_IN_INT ((sizeof (int) * CHAR_BIT)/3 + 1) 

int to_array(int number, int *digits) { 
    int *digitsp = digits; 
    do { 
     *digitsp++ = number % 10; 
     number /= 10; 
    } while(number > 0); 
    return digitsp - digits; 
} 

int main() { 
    int number = rand(); 
    int digits[MIN_DIGITS_IN_INT]; 
    int n = to_array(number, digits); 

    /* test whether we're right */ 
    while(n-- > 0) 
     printf("%d", digits[n]); 
    } 
    printf(" = %d\n", number); 
} 

Je préfère automatique arr Ays à l'allocation de mémoire dynamique dans ce cas, car il est plus facile de le faire correctement et ne pas fuir accidentellement.

+0

"Un peu plus de 3 bits?" Je pense que vous venez de gagner une sorte de prix de phrasé. – unwind

+0

ouais, je trouve que ça sonne étrange oO ​​laissez-moi le changer –

+0

Impressionnant comment différent chemin logique produit les mêmes résultats :) 32/3 + 1 est presque le même que log10 (2 ** 32) + 1 == log2 (2 * * 32)/log2 (10) + 1 == 32/log2 (10) + 1 <32/3 + 1 – vava

1

Si vous devez prendre en compte des nombres négatifs, vous aurez peut-être besoin d'une logique supplémentaire. En fait, lorsque vous jouez avec des tableaux, vous ne connaissez pas la taille d'upfront, vous pouvez vouloir faire plus de vérification de sécurité, et ajouter une API pour gérer la structure des données est très pratique aussi.

// returns the number of digits converted 
// stores the digits in reverse order (smalles digit first) 
// precondition: outputdigits is big enough to store all digits. 
// 
int convert(int number, int* outputdigits, int* signdigit) { 

    int* workingdigits = outputdigits; 

    int sign = 1; 
    if(number < 0) { *signdigit = -1; number *= -1; } 
    ++workingdigits; 

    for (; number > 0; ++ workingdigits) { 
    *workingdigits = number % 10; 
    number = number/10; 
    } 

    return workingdigits - outputdigits; 
} 

void printdigits(int* digits, int size, int signdigit) { 
    if(signdigit < 0) printf("-"); 

    for(int* digit = digits+size-1; digit >= digits; --digit){ 
    printf("%d", *digit); 
    } 
} 

int main() { 
    int digits[10]; 
    int signdigit; 
    printdigits(digits, convert(10, digits, &signdigit), signdigit); 
    printdigits(digits, convert(-10, digits, &signdigit), signdigit); 
    printdigits(digits, convert(1005, digits, &signdigit), signdigit); 

} 
+0

aucun nombre négatif requis, heureusement. C'est un compteur d'heures comptées. Il est possible que ce nombre puisse devenir assez important. – droseman

6

Vous pouvez calculer le nombre de chiffres d'un nombre entier avec un logarithme plutôt qu'une boucle. Ainsi,

int * toArray(int number) 
{ 
    int n = log10(number) + 1; 
    int i; 
    int *numberArray = calloc(n, sizeof(int)); 
    for (i = 0; i < n; ++i, number /= 10) 
    { 
     numberArray[i] = number % 10; 
    } 
    return numberArray; 
} 
+0

+1 Cela me semble bon –

0

en utilisant le code de vadim, je suis venu avec ce programme de test:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

char * convertNumberIntoArray(unsigned int number) { 
    unsigned int length = (int)(log10((float)number)) + 1; 
    char * arr = (char *) malloc(length * sizeof(char)), * curr = arr; 
    do { 
     *curr++ = number % 10; 
     number /= 10; 
    } while (number != 0); 
    return arr; 
} 



int main(void) 
{ 
    int InputNumber; 
    int arr[5]; 

    printf("enter number: \n"); 
    scanf("%d", &InputNumber); 

    convertNumberIntoArray(InputNumber); 

    printf("The number components are: %d %d %d\n", arr[0],arr[1],arr[2]); 

    system("PAUSE");  
    return 0; 
} 

mais la sortie est une ânerie. Quelqu'un peut-il conseiller si j'ai fait quelque chose de stupide ici?

/***** output *****/ 
enter number: 
501 
The number components are: 2009291924 2009145456 -1 
Press any key to continue . . . 

--dave

+0

La fonction retourne un tableau. Vous avez besoin de ceci: 'char * arr; arr = convertNumberIntoArray (InputNumber); 'Notez que' arr' devrait être un 'char *', pas un 'int []'. Si vous voulez que ce soit un 'int *', vous devriez changer la fonction pour retourner 'int *', pas 'char *'. –

+0

merci Chris, ça marche maintenant – droseman

+0

n'oubliez pas de libérer (arr) après que vous avez terminé avec elle. Alternativement, vous pouvez utiliser l'approche @litb et créer un tableau statique avec la longueur (32/3 + 1) == 11 et juste le remplir ensuite. – vava

1

Essayez ceci,

void initialise_array(int *a, int size, int num) { 
    for (int i = 0; i < size; ++i, num /= 10) 
     a[(size - 1) - i] = num % 10; 
} 
Questions connexes