web-dev-qa-db-ja.com

scanfとscanf_sの違い

scanfscanf_sの違いは何ですか?大学では教えられており、scanfを使用していますが、私のパソコンではVisual Studioがこの警告を送信し続けます。

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

そして、すべてのscanfscanf_sに変更する必要があります。そうしないと、プログラムがビルドされません。 (私はVisual Studio 2013を使用しています)

22
Tony Andreev

これは、Microsoftコンパイラ専用の機能です。

scanfは元々、入力したコンソール入力を読み取り、それを変数の型に割り当てます。

first_name[5]という配列があり、「Alex」にscanfを使用している場合、問題はありません。同じ配列を持ち、「Alexander」を割り当てると、配列に含まれる5スロットを超えることがわかります。そのため、Cは配列に属さないメモリに書き込み、プログラムをクラッシュさせる場合としない場合があります。 、何かがfirst_nameに属さないメモリスロットにアクセスして書き込みを試みるかどうかによって異なります。これがscanf_sの出番です。

scanf_sには引数(パラメーター)があり、ここでバッファーサイズを指定し、実際に入力の制限を制御して、建物全体がクラッシュしないようにすることができます。

27
ironslab

scanf_s()は、C99標準(または以前のもの)では記述されていません。

C99(またはそれ以前)をターゲットとするコンパイラを使用する場合は、scanf()を使用します。

C11標準(最終的には後の標準)では、scanf_s()scanf()よりも使用が難しく、バッファオーバーフローに対するセキュリティが向上します。

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

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

拡張機能としてscanf_s()を提供するエクストラを備えたC99コンパイラをお持ちで、移植性が失われない場合は、コンパイラのドキュメントを確認してください。

10
pmg