C言語のsscanf

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

char buf[512] = ;

sscanf("123456 ""%s", buf);

printf("%s\n", buf);

結果は次のようになります: 123456

2. 指定した長さの文字列を取得します。次の例のように、最大​​長が 4 バイトの文字列を取得します。

1

2

sscanf("123456 ""%4s", buf);

printf("[%s]\n", buf);

結果は次のようになります: [1234]

3. 指定した文字までの文字列を取得します。次の例のように、スペースが見つかるまで文字列を取得します。

1

2

sscanf("123456 abcdedf""%[^ ]", buf);

printf("%s\n", buf);

結果は次のようになります: 123456

4. 指定された文字セットのみを含む文字列を取得します次の例のように、1 ~ 9 と小文字のみを含む文字列を取得します

1

2

sscanf("123456abcdedfBCDEF""%[1-9a-z]", buf);

printf("%s\n", buf);

結果は次のようになります: 123456abcdedf

5. 指定した文字セットまでの文字列を取得します。次の例のように、大文字が見つかるまで文字列を取得します。

1

2

sscanf("123456abcdedfBCDEF""%[^A-Z]", buf);

printf("%s\n", buf);

結果は次のようになります: 123456abcdedf

6. 文字列 iios/12DDWDFF@122 を指定すると、/ と @ の間の文字列を取得し、最初に「iios/」をフィルターで除外してから、「@」以外の文字列を buf に送信します。

1

2

sscanf("iios/12DDWDFF@122""%*[^/]/%[^@]", buf);

printf("%s\n", buf);

結果は次のようになります: 12DDWDFF

7. 文字列「hello, world」を指定すると、「world」のみが保持されます(注:「,」の後にスペースが入っています)

1

2

sscanf("hello, world""%*s%s", buf);

printf("%s\n", buf);

結果は次のようになります: 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",数値);

おすすめ

転載: blog.csdn.net/poject/article/details/128576209