7

次の文字列を sscanf で解析しようとしています。

query=testword&diskimg=simple.img

sscanf を使用して「testword」と「simple.img」を解析するにはどうすればよいですか? sscanf のデリミタ引数は本当に私を混乱させます:/

ありがとうございました!

4

1 に答える 1

16

「テストワード」の長さが常に8文字になることがわかっている場合は、次のように実行できます。

char str[] = "query=testword&diskimg=simple.img";
char buf1[100];
char buf2[100];

sscanf(str, "query=%8s&diskimg=%s", buf1, buf2);

これで、buf1には「testword」が含まれ、buf2には「simple.img」が含まれます。

または、testwordの前に常に=が付き、その後に&が続き、simple.imgの前に常に=が付いていることがわかっている場合は、次を使用できます。

sscanf(str, "%*[^=]%*c%[^&]%*[^=]%*c%s", buf1, buf2);

かなりわかりにくいので、ここに要約を示します。各%は、テキストのチャンクの開始を示します。%の後に*がある場合は、そのチャンクを無視し、バッファの1つに格納しないことを意味します。角かっこ内の^は、このチャンクに角かっこ内の文字ではない任意の数の文字が含まれていることを意味します(^自体を除く)。%sは任意の長さの文字列を読み取り、%cは単一の文字を読み取ります。

要約すると:

  • =でない場合は、文字を読み、無視し続けます。
  • 別の文字(等号)を読んで無視します。
  • これでテストワードに到達したので、&文字に遭遇するまで文字を読み取り、buf1に格納し続けます。
  • 読んで無視する文字が増えました。=をもう一度押すまで続けます。
  • 単一の文字(ここでも等号)を読み取って無視します。
  • 最後に、残ったもの( "simple.img")をbuf2に保存します。
于 2012-12-07T05:39:00.900 に答える