2017-01-01 3 views
-2

Que se passe exactement si je fais ce qui suitComma entre les deux entiers pendant l'entrée

scanf("%d,%d", &i, &j); 

et fournir une entrée qui provoque l'échec correspondant? Va-t-il stocker les déchets dans j?

+3

Quelle est votre contribution? –

+0

On dirait une duplication de: http://stackoverflow.com/questions/15091284/read-comma-separated-input-with-scanf –

+3

[pourquoi ne pas lire la page de manuel] (https://linux.die.net/ man/3/scanf) –

Répondre

5

L'entrée doit exactement correspondent le fourni le format pour scanf() être le succès.

C11 Citant, chapitre §7.21.6.2, fsacnf(), (Souligné par)

Sauf dans le cas d'un spécificateur %, l'élément d'entrée (ou, dans le cas d'une directive %n, le nombre de caractères d'entrée ) est converti en un type approprié au spécificateur de conversion. Si l'élément d'entrée n'est pas une séquence correspondante, l'exécution de la directive échoue: cette condition est un échec de correspondance. À moins que la suppression d'affectation ait été indiquée par un *, le résultat de la conversion est placé dans l'objet pointé par le premier argument suivant l'argument de format qui n'a pas déjà reçu un résultat de conversion. Si cet objet n'a pas un type approprié ou si le résultat de la conversion ne peut pas être représenté dans l'objet, le comportement n'est pas défini.

et,

Lorsque toutes les directives ont été exécutées ou si une directive échoue (comme détaillé ci-dessous), la fonction retourne.

Ainsi, la consolidation des cas ci-dessus,

  • Pour une entrée comme 100, 200, le balayage sera le succès. Les deux i et j contiendront les valeurs données, 100 et 200, respectivement.

  • Pour une entrée comme 100 - 200, le balayage échouera (défaut correspondant) et la teneur en j restera inchangé, à savoir j est pas affecté toute valeur par scanf() opération.

conseil: toujours vérifier la valeur de retour de scanf() famille de fonctions pour assurer le succès de l'appel de fonction.