web-dev-qa-db-fra.com

Sscanf ("123456789123456789123456789", "% d", & n) a-t-il un comportement défini?

Lorsque sscanf() ou une autre fonction de la famille scanf reçoit une séquence de chiffres dont la valeur convertie dépasse la valeur maximale du type d'entier cible,

  • la conversion doit-elle être considérée comme ayant échoué?
  • le comportement est-il défini du tout?

De la norme, 7.21.6.2p10 ((f)scanf, s'applique à toute la famille):

… Si cet objet n'a pas de 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.

On dirait une autre raison d'être très prudent avec la famille scanf. Les fonctions strtoXX ont un comportement entièrement défini. Ils sont de retour LONG_MAX etc. pour une entrée trop grande et définissez errno == ERANGE. Donc, si vous avez besoin d'informations exactes, effectuez une tokenisation manuelle de l'entrée et utilisez ces fonctions pour la conversion. Autre avantage: meilleure gestion des erreurs.

47