2016-12-01 1 views
0

Ceci est ma première question, alors pardonnez-moi si je me trompe. Je suis très novice en programmation, et j'ai rencontré un problème, je n'arrive pas à trouver une solution en ligne. Lorsque j'utilise scanf pour un entier, si mon imput commence avec un ou deux zéros, dans certains cas il le lira dans un autre système (pas même binaire). Par exemple, 0020 deviendra 16, 0030 deviendra 24, 0100 deviendra 64.Scanf lit un mauvais entier quand 0 en face

Il semble fonctionner avec des pouvoirs de 8, et examiner les chiffres jusqu'à 8 (en tapant 0009 lui fera imprimer 0 puis 9).

Il pourrait y avoir une règle simple dont je ne suis pas au courant, je suis désolé si la réponse est évidente. Merci d'avance pour tous ceux qui répondent!

+2

montrez-nous le code – JerryGoyal

+1

vous devriez publier votre échantillon de code pour nous aider à comprendre – cokceken

+0

[Cette référence 'scanf' (et la famille)] (http://fr.cppreference.com/w/c/io/fscanf) devrait soit utile. –

Répondre

1

Il existe différentes notations pour les bases populaires (base 8, 10 et 16) . Base 8: Également connu sous le nom d'Octal.

Vous définissez un nombre comme base 8 lorsque vous mettez un 0 devant le numéro d'entrée. Ainsi, lorsque vous entrez 020, il est lu 16 en décimal. Base 10: Également connu sous le nom de Décimal.

Vous venez d'écrire un nombre que vous voulez entrer sans aucun 0 s. Ainsi, lorsque vous entrez 20, il est lu comme 20. Base 16: Également appelée hexadécimal.

Vous l'écrivez avec un 0x à l'avant. Donc en entrant 0x20, il sera stocké comme 32 en décimal.

Si vous lisez le numéro à l'aide scanf() avec spécificateur de format comme %d%i, il est en train de lire un nombre octal et de l'interpréter comme un entier.

+0

Le '% d' signifie toujours décimal (d'où" d "), il ignorera les zéros en tête et ne sera jamais converti en base 8. – Dai

+0

@Dai Vous avez raison –

4

La documentation scanf indique que le caractère de format i ...

i Matchs un entier éventuellement signé le pointeur suivant doit être un pointeur vers int. L'entier est lu en base 16 s'il commence avec 0x ou 0X, en base 8 s'il commence par 0, et en base 10 sinon. Seuls les caractères correspondant à la base sont utilisés.

Si vous voulez lire la force d'un nombre décimal entierpuis utilisez spécificateur de format d

d correspond à un nombre entier décimal éventuellement signé le pointeur suivant doit être un pointeur vers int.

J'imagine donc ce que vous avez:

int value; 
int n = scanf("%i", &value); 

Modifier à ceci:

int value; 
int n = scanf("%d", &value);