-2
votes

Obtenir un "-317629566" Chaque fois que j'exécute le code

J'utilise dev ++ pour la programmation C et j'ai fabriqué sur un programme simple d'ajout, de soustraire, multi et div. Il n'y a pas d'erreur dans mon code mais je reçois un type différent de 9 chiffres ( -317629566 code>) de message avec la sortie dans mon écran de sortie.

select a operator( + , - , * , / ) :: +
enter first number : 12
enter second number : 13
addition : 25-317629566

c

7 commentaires

Printf ("Add:% d% d", A + B); est incorrect, il attend 2 valeurs et vous ne fournissez qu'un. Déposer un % d : printf ("addition:% d \ n", A + B);


@Cristifati vous avez donné la réponse, par curiosité, pourquoi avez-vous utilisé une remarque plutôt qu'une réponse? Je suis surpris parce que sans réponse lorsque nous examinons la liste des questions que nous ne pouvons pas savoir que le problème a été résolu, de sorte que beaucoup de gens viendront sur cette question pour rien


Si vous voulez que les gens écrivent dans des réponses plutôt que dans les commentaires, arrêtez les gens de voter des réponses quand ils n'aiment pas la question.


@bruno: J'ai repéré un problème (ils peuvent être d'autres). De plus, je pensais qu'il devrait y avoir de nombreuses questions en double sur ce sujet. Après une recherche rapide, je n'ai trouvé aucun.


@Cristifati mer merci beaucoup


De rien! Avez-vous lu ma réponse?


@Cristifati oui oui je l'ai fait. J'ai lu votre réponse et cela m'a aidé.


3 Réponses :


-1
votes

Le problème réside dans la façon dont vous affichez les données:

printf("addition : %d", a + b);


1 commentaires

Merci beaucoup



0
votes
printf("addition : %d%d", a + b);
You are asking printf to print two integers, but you are only passing one. This causes undefined behavior. In this case, it's just printing an arbitrary value, but potentially worse things could happen.

0 commentaires

0
votes

Comme je l'ai écrit dans mon commentaire, tous les énoncés 4 Printf (à l'intérieur de l'interrupteur bloc) sont faux.

Selon [CPPreference]: std :: printf, std :: fprintf , STD :: Sprintf, STD :: SnPrintf ( L'accent est mis sur est le mien):

  • ... - Arguments spécifiant les données à imprimer. Si un argument après conversions par défaut n'est pas le type attendu par la correspondance Spécificateur de conversion, ou s'il y a moins d'arguments que requis par le format, le comportement est indéfini . S'il y a plus d'arguments que requis par le format, les arguments étrangers sont évalués et ignorés

    Prenons la 1 st ( printf ("addition:% d% d", A + B); ) à titre d'exemple:

    • votre format de chaîne ( printf 'S 1 st argument) contient 2 % d (entier signé dans Décimal) Spécificateurs de conversion, ce qui signifie que printf s'attend à 2 Valeurs entier après elle
    • A + B ne produit que 1 valeur entière, et vous tombez dans le comportement comportement non défini branche. Dans ce cas, printf sorties les données de déchets (d'une adresse de mémoire "aléatoire"), mais gardez à l'esprit qu'il pourrait y avoir des cas lorsque le programme pourrait s'écraser

      Afin de résoudre les problèmes:

      • Assurez-vous que le numéro des spécificateurs de conversion correspond au numéro d'arguments (faites également attention à leur type) qui suivent le format: printf ("addition:% d", A + B);

      • Pour prendre les choses plus loin, afin d'avoir une sortie joliment formatée, ajoutez un " \ n " ( lf , 0x0a , eoln ) caractère à la fin de la chaîne de format: Lorsqu'un tel caractère est rencontré, il n'est pas affiché à l'écran, mais le curseur saute au début de la ligne suivante: printf (" Addition:% d \ n ", A + B);

      • Pour prendre des choses encore plus loin, vous pouvez également imprimer les chiffres qui ont donné ce résultat: printf ("addition:% d +% d =% d \ n", A, B, A + B ); ( 3 % d s, 3 entiers après le spécificateur de format)

        En tant que note finale (non liée à la question elle-même), vous voudrez peut-être éviter la division lorsque B est 0.


0 commentaires