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();
}
9 Réponses :
La variable Choix code> est de type court code> c'est pourquoi vous avez besoin du spécificateur % h code> dans scanf à lire (en fait vous N'a pas besoin du d code> ici). Le type INT code> nécessite simplement % d code>. Voir les notes sur les conversions ici P>
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.
avec Pour plus d'informations, voir cette page de référence sur scanf p > scanf code>, le modificateur "H" indique qu'il lit un entier court, que votre variable choix code> 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. p>
Bonjour, % HD code> fonctionne en effet, mais alors, pourquoi ces Entrée Wikipedia < / a> et ne fait aucune mention quelconque, indiquant que < code>% h code> doit être utilisé ??
Vous lisez dans un court. L'H est nécessaire car% d est la taille d'un INT par défaut. Voir cette page de référence sur scanf . P>
% d code> est destiné à lire un int code>, 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. P>
On dirait que votre problème est que Choix code> est un court code>, qui est (généralement) 2 octets long, tandis que % d code> attend un Integer, qui est (généralement) 4 octets long ... donc le scanf code> Clobbers tout ce qui vient après Choix code> sur la pile. p>
Lorsque vous spécifiez% d, SCANF doit supposer que l'argument associé est un point de pointeur sur un bloc de mémoire code> int code> et écrira un dans GCC -WFormat devrait vous donner un avertissement lorsque vous faites cette erreur. P> Choix code> est un court code> et% d spécifie un int code>. p>
int code>. Lorsque cela se produira, il sera probablement d'écrire sur des données adjacentes à, mais ne partie pas du choix code> 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 em> comportement! P>
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
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. P>
de la Comp.lang.ca FAQ: P>
Désolé pour le mauvais formatage de texte