web-dev-qa-db-fra.com

Stocker un entier dans un tableau de caractères

J'essaie de stocker un entier dans un tableau char. Comment puis je faire ça? C’est mon approche (en lui attribuant la valeur int en char), mais cela ne fonctionne pas. Qu'est-ce que je rate?

#include <stdio.h>

int main(int argc, char** argv) 
{
    char cArray[10] = {};

    // Store a character in the char array
    cArray[5] = 'c';
    printf("%c\n", cArray[5]);

    // Store an integer in the char array
    cArray[6] = (char) 0; // WHY DOES THIS NOT WORK???
    printf("%c\n", cArray[6]);
}
7
user2426316
cArray[6] = (char) 0; // WHY DOES THIS NOT WORK???
printf("%c\n", cArray[6]);

Ce code tente d’imprimer un caractère avec le codage 0; en supposant ASCII, rien ne sera affiché car il n'y a pas de caractère imprimable associé à ce code. 

Si vous souhaitez stocker le code ASCII du caractère caractère'0' et l'imprimer, vous devez écrire

cArray[6] = 48;               // same as writing cArray[6] = '0' (ASCII)
printf( "%c\n", cArray[6] );

Ceci imprimera 0 sur votre console. 

Si, par contre, vous voulez stocker any valeur entière arbitraire1 pour cArray[6] et afficher cette valeur, vous devez utiliser le spécificateur de conversion %d:

cArray[6];
printf( "%d\n", cArray[6] );


1. C’est-à-dire tout nombre entier compris entre char, de toute façon

7
John Bode

Commençons par les bases. 

Pour l'architecture x86 (en supposant que vous l'utilisiez), une variable char est stockée dans un octet et une variable int dans 4 octets. 

Il est IMPOSSIBLE de stocker une valeur entière random dans une variable char, à moins que vous n'ayez un schéma de compression et que vous sachiez que certaines valeurs entières ne se produiront pas (pas au hasard!) Dans votre programme. Aucune exception. 

Dans votre cas, vous souhaitez stocker des entiers dans un tableau de caractères. Il y a quatre options:

1.Si vous souhaitez stocker un entier aléatoire dans ce tableau de caractères, vous devez alors obtenir le pointeur sur l'index sur lequel vous souhaitez stocker l'entier, le convertir en un pointeur entier et l'utiliser comme cela.

char mychars[10];
int * intlocation = (int*)(&mychar[5]);
*intlocation = 3632; // stores 3632

Attention, cela va écrire sur 4 octets (4 emplacements de caractères dans votre tableau) à partir de l'index que vous avez spécifié. Vous devriez toujours vérifier que vous ne sortez pas du tableau.Vous devriez également faire le même casting pour récupérer la valeur si nécessaire.

2.Si vos valeurs sont comprises entre [0,255] ou [-128,127], vous pouvez stocker en toute sécurité vos entiers dans un caractère car ces plages peuvent être représentées à l'aide d'un octet. Attention, le caractère signé ou non signé est dépendant de l'implémentation. Regarde ça!

mychars[5] = 54;

3.Si votre nombre entier est juste un chiffre, vous pouvez utiliser la représentation en caractères du chiffre. 

mychars[5] = your_digit + 48; // 48 is the ascii code for '0'

4.Si vous souhaitez stocker la représentation sous forme de chaîne de votre entier, vous devez alors utiliser itoa() et écrire chaque caractère de la chaîne résultante dans votre tableau, un par un. Dans ce cas, vous devriez toujours vérifier que vous ne sortez pas du tableau.

12
Seçkin Savaşçı

Normalement, un ordinateur fait exactement ce que vous lui dites. L'instruction DWIM (faites ce que je veux dire) n'a pas encore été inventée.

cArray[6] = (char) 0; // WHY DOES THIS NOT WORK???

définit la position d'index 6, mais

printf("%c\n", cArray[5]);

imprime la position d'index 5.

1
glglgl

Vous pouvez utiliser itoa(0,&cArry[6],10).

0
deeiip

Vous pouvez ajouter la valeur ASCII de 0 à la valeur que vous souhaitez stocker dans le tableau de caractères. Par exemple, si vous souhaitez stocker 0,1, ..., 9 dans le tableau de caractères A [10], vous pouvez utiliser le code suivant.

     for(j = 0; j<k; j++)
     {
          A[j] = j + '0';  // Same effect if you use A[j] = j + 0x30
     }

Cela ne fonctionne que si le nombre entier que vous souhaitez stocker est inférieur à 10. Sinon, vous devrez extraire les chiffres à l'aide de l'opérateur modulo et le stocker.

0
user1462840

Utilisez le spécificateur de format souhaité.

cArray[6] = (char) 0; fait stocke un entier 0 dans l'élément de tableau cArray[6]. C'est la printf() qui trompe OP en pensant que cela n'a pas fonctionné.

Utiliser %c indique que OP veut le caractère qui est codé avec un 0. (Ce n'est généralement pas visible) Utilisez% d pour imprimer la valeur entière de cArray[6].

printf("%d\n", cArray[6]);
0
chux

Remplacer 

cArray[6] = (char) 0; // WHY DOES THIS NOT WORK???
printf("%c\n", cArray[5]);

Par

cArray[6] = (char)51;
printf("%c\n", cArray[6]);

Devrait afficher '3'

Je pense que vous comprendrez votre erreur ... 0 car int ne représente pas le caractère imprimable '0', mais la chaîne de terminaison NULL

51 comme int représente le caractère '3'

0
benjarobin