C言語の関数のsscanf()使用 - 指定されたデータフォーマット(RPM)と一致する文字列から読み出します

C言語の関数のsscanf()の利用

のsscanfは() -文字列から指定された形式の試合データを読み込む。
  関数プロトタイプ:
  int型のsscanf(STR文字列、文字列FMT、混血VAR1、VAR2 ...ミックス);
  scanfのint型(CONST文字*フォーマット[、引数 ] ...);
  説明:
  sscanf関数scanfのと同様の、入力のために使用されるが、入力ソース、入力ソースとして固定された文字列を元としてスクリーン(STDIN)に後者れます。
  前記フォーマットは、1つまたは複数であってもよい{%が[*] [幅]タイプ[{H | L} L | | I64] | '' | '\ T' | '\ n' | }%の非標識
  注
  1 *フォーマットも使用することができる(すなわち、%の* dと%の* S)プラスアスタリスク(*)は、このデータが読み出されないスキップ示している。(このデータは、パラメータに読み込まれていない)
  2、{A | B |、C}、Bを表し、いずれかを選択してC [D]、何のD Dが存在しないことを意味します。
  図3は、幅が読み取り幅を表します。
  4、{H | L | I64 | L}:サイズパラメータ、一般hは単一バイトのサイズを表し、Iは、2バイトの大きさを表し、Lは4バイトのサイズ(二重例外)を表し、L64は、8バイトの大きさを表します。
  5、タイプ:このロットは%sの%dと同様です。
  図6に示すように、具体的には:%* [幅] [{ H | L | I64 | L}]タイプが表す条件を満足する数が除外され、目標パラメータ値に書き込まれていない
  集団的動作をサポート:
  %は、[AZ]は、zに一致貪欲任意の文字は、(同じくらい一致する)を表す
  %は、[AB ']は、一、貪欲で、B、一致する'
  %の[^ A非マッチの任意の文字、貪欲
注:読み文字列が空の文字列で、値を変更しないのsscanf関数は、文字列に読み込むことができます。

例:
  1.一般的な使用。
  BUFチャー[512] =;
  のsscanf( "123456"、 "%S"、BUF);
  のprintf( "%S \のN-"、BUF);
  結果:123456
  2.指定された文字列の長さを取ります。以下、一例として、4バイト文字列の最大長さをとります。
  sscanf( "123456"、 "%4S"、BUF);
  のprintf( "%S \のN-"、BUF);
  結果:1234
  3.指定した文字列を取り上げます。次の例として、スペースが遭遇した文字列を取りました。
  sscanf( "123456 abcdedf"、 "[^]%の"、BUF);
  のprintf( "%S \のN-"、BUF);
  結果:123456
  のみ指定した文字セットを含む4テイク文字列。次の例として、1-9を取るだけ小文字の文字列が含まれています。
  sscanf関数( "123456abcdedfBCDEF"、 "% [1-9a-Z]"、BUF)。


  5.指定された文字セットまでの文字列を取ります。次の例として、我々は文字列は大文字と小文字を取り上げ遭遇します。
  sscanf関数( "123456abcdedfBCDEF"、 "%の[^ AZ]"、BUF);
  のprintf( "%S \ N-"、BUF);
  結果:123456abcdedf
  。6、指定された文字列IIOS / 12DDWDFF 122、取得/ @と最初の文字列の間で"IIOS /"非次いで、濾別'@' BUFの文字列の内容
  のsscanf( "122 @ IIOS / 12DDWDFF "、「%※[^ /] /%の[^ @] "BUF);
  のprintf( "%S \ N-;"、bufが)
  結果:12DDWDFF
  スペースの後に":。7、唯一の世界(ノートを保持文字列"は" hello、world"を、与えられました" )
  のsscanf( "こんにちは、世界"、 "*%S%S"、BUF);
  のprintf( "\ N-%s"は、BUF);
  結果:世界
  %※Sは%sのために濾過マッチド表し、そのハローが濾過される外
  にスペースがない場合、結果はNULLです。
  sscanf関数の機能は、正規表現に非常に似ていますが、ない強力な正規表現、その文字列は、より複雑なため取り扱い場合、正規表現を使用することをお勧めします。


  上記の表現STRからは、Xに番号を入力し、32700される
  数年前、私は、cは、分割文字列関数を所有していないと思ったが、その後私はsscanf関数を見つけ、すべてに沿って、私はsscanf関数にスペースのみ定義された文字列を考えて、そして今、私が見つけます私は間違っていました。
  sscanf関数は、実行時の関数のプロトタイプは簡単です:
  int型のsscanf(
  のconstのchar *バッファ、
  constのchar型*フォーマット[、
  引数] ...
  );
  これは、フォーマットのための強力なサポートに反映されています。
  03:私は以前、この2006のような文字列を分離するために使用される18である:
  int型A、B、C、
  のsscanf( "2006年度:03:18である"、 "%のD:%のD:Dの%"、A、B、C );
  および2006:03:18である、 - :2006年04:18である:
  チャーsztime1 [16] = ""、sztime2 [16] = "";
  のsscanf( "2006年度:03:18である、 - :2006年04:18である"、「% - sの%sの」、sztime1、 ; sztime2)
  03:18から2006:しかし、その後、私は2006年に処理する必要が午前4時18分
  『 - 』ちょうどキャンセルスペースの両側に、しかし、文字列の%sの定義を破りました。
  私はこのような状況を処理するための機能を再設計する必要がありますか?これは複雑ではありませんが、コードのすべてが統一されたスタイルを持っている作るために、私は自分のパーティション関数に既存のsscanf関数を置き換えるために、多くの場所を変更する必要があります。私は間違いなくこれを行う必要があると思うし、睡眠の強い不満とsscanf関数を伴う、目が覚め、実際にする必要がないことを発見しました。
  フォーマット型%[]はこのようなタイプのフィールドを有していました。読み文字列がスペースで区切られていない場合は、[]%を使用することができます。
  %[]正規表現に似ています。[AZ]意味は[^ AZ]は、zを除くすべての文字を読み取ることを意味し、AZすべての文字を読んで。
  だから、問題は解決されます
  のsscanf( "2006:03:18から2006:04:18"、 "%[0-9、:] - %[、:0-9]"、sztime1、sztime2)。

 

転送:https://www.cnblogs.com/lyq105/archive/2009/11/28/1612677.html

おすすめ

転載: www.cnblogs.com/zl1991/p/11579442.html