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)
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.
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.