-1
votes

Comportement anormal scanaf en c

J'essaie d'exécuter le code suivant en C:

Please enter the first number: 13
Please enter the second number: 4
0 4

--------------------------------
Process exited after 1.877 seconds with return value 4
Press any key to continue . . .


3 commentaires

N'était-il pas possible de copier et collez la sortie? Poster des images de texte n'est pas la chose la plus gentille que vous puissiez faire pour les personnes qui essaient de vous aider.


Je suis désolé, je pensais que copier et coller le code était la norme. Je vais le mener tout de suite.


Merci et désolé pour la langue dure. Vous avez deux réponses ci-dessous que les deux pointent sur le même problème.


3 Réponses :


1
votes

Un int16_t n'est pas la même chose que l'INT; Donc, passer un pointeur à un via scanf et prétendre que c'est un pointeur INT peut donner un comportement inattendu; Ainsi, votre question.

Remplacez INT16_T avec int et votre programme fonctionne. Pour le suivi, lisez la spécification de langage de programmation C des types et de ce qu'ils veulent dire.


1 commentaires

Je réalise l'erreur là-bas. En fait, j'ai l'intention d'utiliser int16_t pour ce programme particulier. Merci de votre aide.



0
votes

Essayez de changer de: scanf ("% hd" et secondnum);

% d est un spécificateur de données de 4 octets, int16_t est en réalité seulement 2 octets.

Plus de références: https://docs.microsoft.com/en-us/cpp/c-Runtime-library/Format-Specification-Syntax-printf-and-wprintf-fonctions?views- 2019


2 commentaires

% d in scanf La famille correspond à un entier signé, qui ne doit pas nécessairement être de la largeur de 4 octets et l'argument correspondant doit être un pointeur pour signé entier. Le spécificateur approprié pour int16_t est "%" scnd16 dans scanf famille.


"% hd" meilleur utilisé avec signé court . int16_t est souvent identique à celui de bref signé , mais peut différer. Donc, quand il diffère (rare), scanf ("% hd", & secondnum) est UB.



4
votes

Le spécificateur approprié pour int16_t secondnum est de xxx

meilleur code vérifierait la valeur de retour. < / p> xxx


0 commentaires