[C]文字をキーボードから入力「scanf_s」

[スポンサードリンク]

今まで使用していた「scanf」は危険ってどういうこと?

scanfを使用するとエラーになる

このソースをビルドしようとすると、Visual Studioではビルドエラーが出て、ビルドも実行もできない。

エラー C4996 ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

この関数または変数は危険です。 代わりにscanf_sの使用を検討してください。

セキュリティが強化されたscanf_s

Visual Studioがscanfを使うなというビルドエラーが出てしまうので、なぜか?
と思いググってみると、scanf関数はバッファオーバーエラーの危険性があるという意見と、scanf関数はバッファオーバーエラーが出ると言うやつのスキルはクソという意見。などなど、ほぼ宗教戦争になっていることもあり。

このブログで紹介できるほど納得のいく情報は得られませんでした。すみません。

※_countof は、固定長配列の要素数を取得するためのマクロです。

char型配列を11個作っていますが、これはchar型配列[0]~[10]の11個を作って文字を10文字格納します。
一番最後のchar型変数には、文字列の終わりである「\0」が付加される。
入力させたい文字数+1個の配列を作ることです。

※10文字以上入力すると、変数に値は入りません。空のまま表示されます。

scanf_sの使い方

配列数は、「_countof()」マクロで取得しています。

入力変換指定子について

よく使う代表的な入力変換指定子については下記の通り

>

入力変換指定子 意味
%d 10進整数
%u 符号なし10進整数
%f float型実数(小数)
%lf double型実数(小数)
%i 10進数、8進数、16進整数
%o 8進数
%x 16進整数
%s 文字列

入力桁数を指定する

先ほど、文字型配列数-1以上の文字が入力されると変数の中に値が入らないということを書きましたが、そのような機能に頼るよりもこちらから入力桁数を決めて、その桁数以上の入力文字は切り捨てるというやり方のほうがいいと思います。

13行目のscanf_sの入力変換指定子の「%5s」で5文字までの入力を受け付けています。

代入抑止指定

代入抑止指定については、想像していたのと動作が異なっていたため。
ここでは取り上げません。

これは、入力変換指定子に「*」を付けるとそのデータははじかれるというもので
「%*s%d」なら、文字列をはじいて「hello123」なら「123」が変数に格納される
というモノらしいですが。

Visual Studioではうまくいかなかったため、割愛します。

入力したデータの変換については、また後日書きます。

[スポンサードリンク]

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

CAPTCHA


ピックアップ記事

  1. ビューの作り方、ANSI_NULLS、QUOTED_IDENTIFIER、WITH(NOLOCK) …
  2. 開始日と終了日にブランクを設定した場合の記述にも対応 (さらに…)…
  3. NPOIを使ってExcelの読み書きをする方法 (さらに…)…
  4. Oracle 12cではCDBとPDBの概念があるため、それより前のバージョンの様にログインすると、…
  5. あいまい検索での否定 ○○以外の書き方 あいまい検索での否定は「[^任意の文字・文字列]…

カテゴリー

[スポンサードリンク]




ページ上部へ戻る