C言語入門講座。関数、サンプル集を参考にして、 C言語をマスターしよう。初心者から上級者まで。

書式に従い、文字列から値を取り出す

2012.08.10

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
式が不当です
$

関連記事