sscanf はscanfに似ており、後者は入力ソースとしてキーボード ( stdin ) を使用し、前者は入力ソースとして固定文字列を使用することを除いて、両方とも入力に使用されます。cjson 文字列解析などの複雑な文字列解析を使用して抽出できます。
2 番目のパラメータには、1 つ以上の {%[*] [ width ] [{h | I | I64 | L}]type | ' ' | '\t' | '\n' | 非%記号}を指定できます。
注記:
1. * は形式でも使用できます (つまり、%*d および %*s)。アスタリスク( *) を追加すると、このデータはスキップされ、読み込まれません。(つまり、このデータはパラメータに読み込まれません)
2. {a|b|c} は a、b、c のいずれかを選択することを意味し、[d] は d を含むかどうかを意味します。
3. 幅は読み取り幅を表します。
4. {h | l | I64 | L}: パラメータ サイズ。通常、h は 1 バイト サイズ、I は 2 バイト サイズ、L は 4 バイト サイズ (二重例外)、l64 は 8 バイト サイズを表します。
5. type: %s、%d など、多数あります。
6. 特殊: %*[width] [{h | l | I64 | L}]type は、この条件を満たすものが除外され、ターゲット パラメータに値が書き込まれないことを意味します。
失敗した場合は 0 を返し、それ以外の場合はフォーマットされたパラメータの数を返します。
7. 読み取った文字列がスペースで区切られていない場合は、%[] を使用できます。
1. 一般的な使用方法
1 2 3 |
|
結果は次のようになります: 123456
2. 指定した長さの文字列を取得します。次の例のように、最大長が 4 バイトの文字列を取得します。
1 2 |
|
結果は次のようになります: [1234]
3. 指定した文字までの文字列を取得します。次の例のように、スペースが見つかるまで文字列を取得します。
1 2 |
|
結果は次のようになります: 123456
4. 指定された文字セットのみを含む文字列を取得します。次の例のように、1 ~ 9 と小文字のみを含む文字列を取得します。
1 2 |
|
結果は次のようになります: 123456abcdedf
5. 指定した文字セットまでの文字列を取得します。次の例のように、大文字が見つかるまで文字列を取得します。
1 2 |
|
結果は次のようになります: 123456abcdedf
6. 文字列 iios/12DDWDFF@122 を指定すると、/ と @ の間の文字列を取得し、最初に「iios/」をフィルターで除外してから、「@」以外の文字列を buf に送信します。
1 2 |
|
結果は次のようになります: 12DDWDFF
7. 文字列「hello, world」を指定すると、「world」のみが保持されます。(注:「,」の後にスペースが入っています)
1 2 |
|
結果は次のようになります: world P.S. %*s は、最初に一致する %s がフィルタリングされて除外されることを意味します。つまり、hello がフィルタリングされます。スペースがない場合、結果は NULL になります。
8. その他の正規表現
この実験では正規表現を使用します。括弧内の a ~ z は正規表現で、a から z までの任意の文字を表すことができます。
補充:
%[ ] の使用法: %[ ] は文字セットを読み取ることを意味し、[ の後の最初の文字が "^" の場合はその逆の意味になります。
[ ]内の文字列は1文字以上で構成できます。空の文字セット (%[]) は不正であり、
予測できない結果につながります。%[^] もルール違反です。
%[az] は、az から z までの間の文字列を読み取り、それより前にない場合は停止します。
char s[]=”こんにちは、友達”; // 注: 、カンマは az と az の間にあります。
sscanf( s, “%[az]”, string ) ; // 文字列=こんにちは
%[^az] は、az の間にない文字列を読み取り、az の間に次のような文字が見つかった場合に停止します。
char s[]=”HELLOkitty”; // 注: a~z の間にはカンマが入ります
sscanf( s, “%[^az]”, string ) ; // 文字列=こんにちは
先頭に * 記号が付いている %*[^=] は、変数が保存されないことを意味します。一致する文字列をスキップします。
char s[]=”メモ帳=1.0.0.1001″ ;
char szfilename [32] = "" ;
int i = sscanf( s, “%*[^=]”, szfilename ); // 保存されていないため、szfilename=NULL
int i = sscanf( s, “%*[^=]=%s”, szfilename ) ; // szfilename=1.0.0.1001
%[^=] は、「=」記号に遭遇するまで文字列を読み取ります。「^」の後にさらに文字を追加できます。
4) 文字列から数値を抽出します。
int a、b、c;
sscanf(“2006:03:18”, “%d:%d:%d”, &a, &b, &c); //a = 2006 b = 3 c = 18
5、
char *str = "サブタイトルを入力:789";
整数;
sscanf(str, "字幕: %lf", &number);
printf("数値:%f\n",数値);