1

sscanf 文字列のフォーマットを理解する際に少し問題があります。

その文字列をstrに保存しています:192.168.0.100/act?bla=

このコードでは、「キー」変数内にblaを格納し、残りのもの (「=」の後) を「buf」変数に格納したいと考えています。

char str[] = "192.168.0.100/act?bla=";
char key[20];
char buf[100];
sscanf(str, "%*[^?] %[^=] %s", key, buf);
4

2 に答える 2

8

およびは消費さ?=ないため、フォーマット指定子に含めてください。

sscanf(str, "%*[^?]?%[^=]=%s", key, buf);

http://ideone.com/YoRMh3のデモを参照してください。

バッファオーバーランを防ぐために、各指定子が読み取ることができる最大文字数を指定します。これは、null終了を許可するために、ターゲット配列より1つ少なく、次の戻り値をチェックして両方の配列にデータが入力されていることを確認しますsscanf()

if (2 == sscanf(str, "%*[^?]?%19[^=]=%99s", key, buf))
{
    printf("<%s>\n", key);
    printf("<%s>\n", buf);
}

値が切り捨てられないようにするために、処理が停止した位置を示す形式指定子をbuf使用できます(の戻り値には影響しないことに注意してください)。入力全体が処理された場合、終了位置は次のようになります。%nint%nsscanf()strlen(str)

int pos;
if (2 == sscanf(str, "%*[^?]?%19[^=]=%5s%n", key, buf, &pos) &&
    strlen(str) == pos)
{
    printf("<%s>\n", key);
    printf("<%s>\n", buf);
}
于 2013-01-10T11:59:47.350 に答える
1

予期される文字を追加して、読み取られて無視されるようにすることができます。

sscanf(str, "%*[^?]?%[^=]=%s", key, buf);

ご了承ください '?' および「=」はまだストリーム内にあり、[^=]処理後に読み取られません。

于 2013-01-10T12:00:21.003 に答える