sscanf関数は、引数で指定した領域から、書式に従い値を取り出します。
この関数はscanf関数やfscanf関数と似ていますが、ファイルから入力するのではなく、指定された領域から入力する点が異なります。
#include <stdio.h>
int sscanf(const char *str, const char *format, …);
*strは取り出す値を含む領域を指定します。
*format(書式)は第3引数以降で指定する領域に入力する値の変換形式を指定します。
第3引数以降は可変引数で、任意の引数を指定できます。ただし、*formatにより、間接的に引数の型名と個数を指定することになります。sscanf関数がこれらの領域に取り出した値を設定しますので、引数は参照渡し(call by reference)になります。
戻り値として、取り出した要素の個数を返します。また、エラーの場合はEOFの値を返します。
*format(書式)はscanf関数やfscanf関数と同じですので、fscanf関数をご覧ください。
プログラム 例
#include <stdio.h>
#include <string.h>
int main(void)
{
char *StrAdd(char *); /* 加算 */
char *StrChomp(char *); /* 改行削除 */
char in_buff[100];
printf('加算の式を入力してください ==> ');
fgets(in_buff, 100, stdin);
printf('%s\n', StrAdd(StrChomp(in_buff)));
return 0;
}
/* 加算 */
char *StrAdd(char *exp)
{
int atai1;
int atai2;
char sign[2];
static char buff[100];
if (sscanf(exp, '%d%1s%d', &atai1, sign, &atai2) == 3) {
if (sign[0] == '+') {
sprintf(buff, '%s = %d', exp, atai1 + atai2);
}
else {
strcpy(buff, '演算子が不当です');
}
}
else {
strcpy(buff, '式が不当です');
}
return buff;
}
/* 改行削除 */
char *StrChomp(char *str)
{
char *str_p;;
for (str_p = str; *str_p; ++str_p)
;
if (*(str_p - 1) == '\n') {
*(str_p - 1) = '\0';
}
return str;
}
例の実行結果
$ ./sscanf.exe 加算の式を入力してください ==> 10+20 10+20 = 30 $ $ ./sscanf.exe 加算の式を入力してください ==> 30 + 40 30 + 40 = 70 $ $ ./sscanf.exe 加算の式を入力してください ==> 10 * 20 演算子が不当です $ $ ./sscanf.exe 加算の式を入力してください ==> 20 式が不当です $