【C言語】scanf_s関数とは?使い方や安全性を解説

この記事では、安全に標準入力からデータを受け取るC言語のscanf_s関数について解説します。

目次から探す

scanf_s関数の概要

scanf_s関数とは

scanf_s関数は、C言語において標準入力からデータを受け取るための関数です。

scanf_s関数は、指定された書式に従って入力データを解析し、変数に格納することができます。

scanf_s関数の使い方

scanf_s関数の基本的な使い方は以下の通りです。

#include <stdio.h>
int main() {
    int num;
    printf("整数を入力してください: ");
    scanf_s("%d", &num);
    printf("入力された整数は %d です。\n", num);
    return 0;
}

上記の例では、ユーザーに整数の入力を促し、その入力を変数numに格納しています。

%dは整数の書式指定子であり、&num変数numのアドレスを指定しています。

scanf_s関数は、書式指定子に応じたデータ型の変数のアドレスを引数として受け取ります。

入力データは、指定された書式に従って解析され、変数に格納されます。

なお、scanf_s関数は安全性を重視して設計されており、バッファオーバーフローなどのセキュリティ上の問題を防ぐために、入力文字列の長さを指定することが必要です。

scanf_s関数は、C11規格で導入された関数であり、一部のコンパイラではサポートされていない場合があります。

その場合は代わりにscanf関数を使用してください。

scanf_s関数の安全性について

scanf_s関数の導入背景

scanf_s関数は、C11規格で導入された関数であり、従来のscanf関数の安全性の問題を解決するために導入されました。

scanf関数は、入力データのバッファオーバーフローのリスクがあるという問題がありました。

バッファオーバーフローは、入力データがバッファのサイズを超えて書き込まれることで、メモリの破壊やセキュリティ上の脆弱性を引き起こす可能性があります。

scanf_s関数の安全性の向上点

scanf_s関数では、従来のscanf関数とは異なり、入力データの長さを指定することが可能になっています。

これにより、バッファオーバーフローのリスクを軽減することができます。

scanf_s関数では、入力データの長さを指定するための引数が追加されており、バッファのサイズを超えた入力が行われると、入力が中断されます。

scanf_s関数の注意点

scanf_s関数を使用する際には、いくつかの注意点があります。

まず、scanf_s関数では、入力データの長さを指定するための引数が必要です。

この引数には、入力データの最大長を指定する必要があります。

また、scanf_s関数では、入力データの最大長を超えた入力が行われた場合には、入力が中断されるため、入力データが切り捨てられる可能性があります。

そのため、入力データが切り捨てられることを避けるためには、適切なバッファサイズを設定する必要があります。

また、scanf_s関数は、エラーの発生を示す戻り値を返します。

正常に入力が行われた場合には、戻り値として1が返されます。

入力エラーが発生した場合には、戻り値としてEOFが返されます。

そのため、scanf_s関数の戻り値をチェックすることで、入力の正常性を確認することができます。

以上が、scanf_s関数の安全性についての概要です。

次に、具体的な使用例を見てみましょう。

1 2
目次から探す