web-dev-qa-db-fra.com

Différence entre scanf et scanf_s

Quelle est la différence entre scanf et scanf_s? À l'université, j'ai appris et j'utilise scanf, mais sur mon ordinateur personnel Visual Studio continue d'envoyer cet avertissement.

 error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead.

Et je dois changer tout scanf en scanf_s ou le programme ne se construira pas. (J'utilise Visual Studio 2013)

22
Tony Andreev

C'est une fonction qui appartient spécifiquement au compilateur Microsoft.

scanf à l'origine lit simplement l'entrée de console que vous tapez et l'affecte à un type de variable.

Si vous avez un tableau appelé first_name[5] et vous utilisez scanf pour "Alex", il n'y a pas de problème. Si vous avez le même tableau et attribuez "Alexander", vous pouvez voir qu'il dépasse les 5 emplacements que le tableau contient, donc C l'écrira toujours sur la mémoire qui n'appartient pas au tableau et il pourrait ou non planter le programme , selon que quelque chose tente d'accéder et d'écrire sur cet emplacement mémoire qui n'appartient pas à first_name. C'est ici que scanf_s entre.

scanf_s a un argument (paramètre) où vous pouvez spécifier la taille du tampon et contrôler la limite de l'entrée afin de ne pas planter tout le bâtiment.

27
ironslab

scanf_s() n'est pas décrite par la norme C99 (ou les précédentes).

Si vous souhaitez utiliser un compilateur qui cible C99 (ou précédent), utilisez scanf().

Pour C11 Standard (et éventuellement les versions ultérieures), scanf_s() est beaucoup plus difficile à utiliser que scanf() pour une meilleure sécurité contre les dépassements de tampon.

C11 fscanf_s(): http://port70.net/~nsz/c/c11/n1570.html#K.3.5.3.2

~~~~~~~~~~~~~~~~

Si vous avez un compilateur C99 avec des extras qui fournit scanf_s() comme extension et que cela ne vous dérange pas de perdre la portabilité, consultez la documentation de votre compilateur.

10
pmg