6
votes

Pourquoi% HD nécessaire dans Scanf?

J'ai créé un profil très simple avec un menu, qui prennent une valeur, puis mémorisez-le dans le valeur variable locale, et enfin avec le Deuxième option Le PROGAM imprime la valeur.

Ma question est la suivante: Pourquoi le programme ne fonctionne que si j'ajoute un "H" au paramètre Scanf? En d'autres termes: quel genre de relation il y a Entre scanf () et ma variable de valeur INT locale? p>

merci! p>

P.s. (J'ai utilisé Dev-C ++ (GCC) pour la compiler. Avec Visual Studio Ça fonctionne) P>

#include <stdio.h>

main () {

    int value = 0;
    short choice = 0;

    do {
       printf("\nYour Choice ---> ");
       scanf("%d", &choice);  /* replace with "%hd" and it works */

       switch (choice) {
          case 1:
               printf("\nEnter a volue to store ");
               scanf("%d", &value);
               getchar();              
               printf("\nValue: %d", value);
               break;
          case 2:
               printf("\nValue: %d", value);            
               break;  
       }

    } while (choice < 3);

    getchar();
}

c

1 commentaires

Désolé pour le mauvais formatage de texte


9 Réponses :


2
votes

La variable Choix est de type court c'est pourquoi vous avez besoin du spécificateur % h dans scanf à lire (en fait vous N'a pas besoin du d ici). Le type INT nécessite simplement % d . Voir les notes sur les conversions ici


2 commentaires

Oui, je sais, mais le problème est de savoir pourquoi à cause de cette "H" manquante, mon programme ne stocke pas la valeur dans la variable de valeur INT?


@Mario: Étant donné que Scanf définit "% HD" pour signifier "Lisez deux octets (sur une plate-forme 32 bits) et placez-la dans un type de données INT court.



12
votes

avec scanf , le modificateur "H" indique qu'il lit un entier court, que votre variable choix se trouve être. Donc, le "% hd" est nécessaire d'écrire seulement deux octets (sur la plupart des machines) au lieu des 4 octets que "% d" écrit.

Pour plus d'informations, voir cette page de référence sur scanf




0
votes

% d est destiné à lire un int , pas un court. Votre code n'a jamais vraiment "travaillé" - cela apparaît simplement que dans ce cas, vous ne remarquez aucune différence entre ce que vous vouliez et le comportement non défini que vous avez eu.


0 commentaires

1
votes

On dirait que votre problème est que Choix est un court , qui est (généralement) 2 octets long, tandis que % d attend un Integer, qui est (généralement) 4 octets long ... donc le scanf Clobbers tout ce qui vient après Choix sur la pile.


0 commentaires

1
votes

Choix est un court et% d spécifie un int .

Lorsque vous spécifiez% d, SCANF doit supposer que l'argument associé est un point de pointeur sur un bloc de mémoire int et écrira un int . Lorsque cela se produira, il sera probablement d'écrire sur des données adjacentes à, mais ne partie pas du choix et les résultats ne sont pas définis et probablement pas bien! Si cela fonctionne dans un compilateur et non un autre qui est simplement la nature de indéfini comportement!

dans GCC -WFormat devrait vous donner un avertissement lorsque vous faites cette erreur.


0 commentaires

0
votes

Le modificateur pour Scanf pour saisir une variable de type courte est% HD. Par conséquent, vous devez spécifier le modificateur correct.

scanf("%d",&integer);  // For integer type
scanf("%hd",&short_int); // For short type


0 commentaires

0
votes

en fonction du rembourrage numérique, de l'endian-ness et d'autres problèmes de ce type, vous pouvez stocker la partie supérieure ou la partie inférieure de la valeur d'entrée dans le choix; Vous stockez le reste de la valeur d'entrée en mémoire qui peut être utilisée ou non pour rien d'autre.


0 commentaires