ユーザー入力用の組み込みライブラリ関数 | sscanf、scanf_s、fscanf_s、sscanf_s

C プログラミング言語は、ユーザー入力用のさまざまな組み込みライブラリ関数を提供します。この記事では、C の sscanf scanf_s fscanf_s sscanf_s ライブラリ関数について学びます。

1. C の sscanf() 関数

sscanf() は、文字列からフォーマットされた入力を読み取るために使用されます。 scanf() 関数と sscanf() 関数はどちらも似ていますが、唯一の違いは、scanf() 関数はキーボードなどの標準入力からユーザーからの入力を読み取り、sscanf() 関数は文字列から入力を読み取り、その入力を別の文字列に保存することです。

構文

int   sscanf   ( const char *   str   const char *   format   ...); 

パラメータ

    str : データを読み取る文字列を入力します。 形式 : 型指定子を含む文字列。 … (省略記号) : 関数が可変数の引数を受け入れることを示します。

戻り値

  • 成功すると、関数は正常に読み取られた値の数を返します。
  • データを正常に読み取る前に入力に失敗した場合は、EOF が返されます。

注記 注: これらの引数は、少なくとも形式指定子によって格納される値の数と同じ数である必要があります。

例: sscanf 関数を説明するための C プログラム

C
   // C program to illustrate sscanf statement   #include         int     main  ()   {      // declaring array s      char     s  []     =     '3 red balls 2 blue balls'  ;      char     str  [  10  ]     str2  [  10  ];      int     i  ;      // %*s is used to skip a word      sscanf  (  s       '%d %*s %*s %*s %s %s'       &  i       str       str2  );      printf  (  '%d %s %s   n  '       i       str       str2  );      return     0  ;   }   

出力
3 blue balls  

2. C の scanf_s() 関数

この関数は Microsoft コンパイラに固有です。バッファの過負荷を引き起こさない点を除けば、scanf と同じです。 scanf_s() 関数は、バッファ オーバーフローを回避できるバッファ サイズを指定する追加パラメータを提供するため、scanf() 関数よりも安全です。

構文

int   scanf_s  (const char *format [argument]...); 

パラメータ

    ストリーム : ストリームを識別する File オブジェクトへのポインタ。 形式 : 型指定子を含む文字列です。 … (省略記号) : 関数が可変数の引数を受け入れることを示します。

注記 : ここではバッファ サイズを指定し、メモリ オーバーフローによってアプリケーション全体がクラッシュしないように、入力の制限を実際に制御できます。

戻り値

  • 成功すると、関数は読み取られた値の数を返します。
  • データを正常に読み取る前に入力に失敗した場合は、EOF が返されます。

scanf_s() を使用する理由

scanf は、コンソールから提供された入力を読み取るだけです。 C は、ユーザー入力が指定した変数に適合するかどうかをチェックしません。 color[3] という配列があり、文字列 Red に scanf を使用すると、正常に動作しますが、ユーザーが 3 文字以上を入力すると、scanf は color 配列に属さないメモリへの書き込みを開始します。

C はこれをキャッチしたり警告したりしません。カラー配列に属さないメモリ スロットに何かがアクセスして書き込もうとするかどうかに応じて、プログラムがクラッシュする場合とクラッシュしない場合があります。ここでscanf_sが活躍します。 scanf_s は、ユーザー入力が指定されたメモリ空間に収まるかどうかをチェックします。

注記 : scanf_s() は Microsoft Visual Studio でのみ機能します。

例 1: sscanf_s 関数を説明するための C プログラム

C
   // C program to illustrate sscanf_s statement   // scanf_s() will only work in Microsoft Visual Studio.   #include         #include         int     main  ()   {      char     a  [  5  ];      // sizeof(a) is buffer size      scanf_s  (  '%s'       a       sizeof  (  a  ));      printf  (  '  n  %s '       a  );      return     0  ;   }   


入力1

Red 

出力1

Red 

入力2

Yellow 

出力2

No Output 

例 2: バッファ サイズと配列サイズの関係を示す C プログラム。

C++
   // C++ program   // consumes the Enter key   // (newline character) pressed after input   #include         int     main  ()   {      // example      char     ch  [  100000  ];      printf  (  'Enter characters: '  );      scanf_s  (  '%s'       ch       99999  );      getchar  ();      return     0  ;   }   
C
   // C program   // consumes the Enter key   // (newline character) pressed after input   #include         int     main  ()   {      char     ch  [  100000  ];      printf  (  'Enter characters: '  );      scanf_s  (  '%s'       ch       99999  );      getchar  ();      return     0  ;   }   
  • バッファ サイズが配列のサイズ以下の場合、バッファ サイズ以上を入力すると、余分なデータが切り捨てられ、バッファ サイズ - 1 までのデータが読み取られるため、データが失われます。
  • バッファ サイズが配列のサイズより大きい場合は、
    • バッファサイズよりも小さい値を入力すると正常に動作しますが、エラーが発生します。

3. C の fscanf_s() 関数

fscanf() と fscanf_s() の違いは、scanf() と scanf_s() の違いと同じです。 fscanf_s() は、各 c C s S および [ ] タイプのフィールドのサイズを変数の直後の引数として渡す必要がある安全な関数です。

構文

int fscanf_s( FILE *stream const char *format [argument ]... ); 

パラメータ

    str : データの取得に使用される文字列 形式 : 型指定子を含む文字列 … (省略記号) : 関数が可変数の引数を受け入れることを示します。

注記 : fscanf_s には、バッファ サイズを指定し、実際に入力の制限を制御するための追加パラメータがあります。

戻り値

  • 成功すると、関数は正常に読み取られた値の数を返します。
  • データを正常に読み取る前に入力に失敗した場合は、EOF が返されます。

注記 : fscanf_s は MS Visual Studio でのみ動作します。

例: fscanf_s 関数を説明するための C プログラム

C
   // C program to illustrate fscanf_s statement   // This program will run on MS Visual studio   #include         #include         int     main  ()   {      char     s1  [  10  ]     s2  [  10  ]     s3  [  10  ];      int     year  ;      // file pointer      FILE  *     fp  ;      // Open file securely      fopen_s  (  &  fp       'file.txt'       'w+'  );      fputs  (  'Hello World its 2017'       fp  );      rewind  (  fp  );      // Using fscanf_s      fscanf_s  (  fp       '%s'       s1       sizeof  (  s1  ));      fscanf_s  (  fp       '%s'       s2       sizeof  (  s2  ));      fscanf_s  (  fp       '%s'       s3       sizeof  (  s3  ));      fscanf_s  (  fp       '%d'       &  year       sizeof  (  year  ));      printf  (  'String1 |%s|  n  '       s1  );      printf  (  'String2 |%s|  n  '       s2  );      printf  (  'String3 |%s|  n  '       s3  );      printf  (  'Integer |%d|  n  '       year  );      fclose  (  fp  );      return     (  0  );   }   


出力

String1 |Hello| String2 |World| String3 |its| Integer |2017| 

4. C の sscanf_s() 関数

sscanf_s() は sscanf() の安全な関数であり、安全な関数では、変数の直後に引数として渡される各 c C s S および [ type フィールドのサイズが必要です。

構文

int   sscanf_s  (const char *  restrict buffer   const char *  restrict format   ...); 

パラメータ

    str : データの取得に使用される文字列 形式 : 型指定子を含む文字列 … (省略記号) : 関数が可変数の引数を受け入れることを示します。

注記 : sscanf_s には、バッファ サイズを指定し、実際に入力の制限を制御するための追加パラメータがあります。

戻り値

  • 成功すると、関数は正常に読み取られた値の数を返します。
  • データを正常に読み取る前に入力に失敗した場合は、EOF が返されます。

注記 : sscanf_s() は Microsoft Visual Studio でのみ機能します。

例: sscanf_s 関数を説明するための C プログラム

C
   // C program to illustrate sscanf_s statement   // This program will run on MS Visual studio   #include         int     main  ()   {      char     s  []     =     '3 red balls 2 blue balls'  ;      char     str  [  10  ]     str2  [  10  ];      int     i  ;      // %*s is used to skip a word      sscanf_s  (  s       '%d'       &  i       sizeof  (  i  ));      sscanf_s  (  s       '%*d %*s %*s %*s %s'       str       sizeof  (  str  ));      sscanf_s  (  s       '%*d %*s %*s %*s %*s %s'       str2        sizeof  (  str2  ));      printf  (  '%d %s %s   n  '       i       str       str2  );      return     0  ;   }   


出力

3 blue balls 

クイズの作成