[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. 画面のパラメータにより異なる検索条件や、異なるテーブルのデータを取得する際。 「UNION ALL…
  2. Oracle 12cではCDBとPDBの概念があるため、それより前のバージョンの様にログインすると、…
  3. SUM関数を使用して累計を求める (さらに…)…
  4. いまの時代、一つの企業に就職してそこで定年を迎えるというのはまれです。 しかし、それが一番いいと私…
  5. MacにEclipseをインストールする方法のまとめ (さらに…)…

カテゴリー

[スポンサードリンク]




ページ上部へ戻る