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 ...);
パラメータ
- 成功すると、関数は正常に読み取られた値の数を返します。
- データを正常に読み取る前に入力に失敗した場合は、EOF が返されます。
- 成功すると、関数は読み取られた値の数を返します。
- データを正常に読み取る前に入力に失敗した場合は、EOF が返されます。
- バッファ サイズが配列のサイズ以下の場合、バッファ サイズ以上を入力すると、余分なデータが切り捨てられ、バッファ サイズ - 1 までのデータが読み取られるため、データが失われます。
- バッファ サイズが配列のサイズより大きい場合は、
- バッファサイズよりも小さい値を入力すると正常に動作しますが、エラーが発生します。
- 成功すると、関数は正常に読み取られた値の数を返します。
- データを正常に読み取る前に入力に失敗した場合は、EOF が返されます。
- 成功すると、関数は正常に読み取られた値の数を返します。
- データを正常に読み取る前に入力に失敗した場合は、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]...);
パラメータ
注記 : ここではバッファ サイズを指定し、メモリ オーバーフローによってアプリケーション全体がクラッシュしないように、入力の制限を実際に制御できます。
戻り値
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; }
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 ]... );
パラメータ
注記 : fscanf_s には、バッファ サイズを指定し、実際に入力の制限を制御するための追加パラメータがあります。
戻り値
注記 : 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 ...);
パラメータ
注記 : sscanf_s には、バッファ サイズを指定し、実際に入力の制限を制御するための追加パラメータがあります。
戻り値
注記 : 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
クイズの作成