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);
およびは消費さ?
れ=
ないため、フォーマット指定子に含めてください。
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
使用できます(の戻り値には影響しないことに注意してください)。入力全体が処理された場合、終了位置は次のようになります。%n
int
%n
sscanf()
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);
}
予期される文字を追加して、読み取られて無視されるようにすることができます。
sscanf(str, "%*[^?]?%[^=]=%s", key, buf);
ご了承ください '?' および「=」はまだストリーム内にあり、[^=]
処理後に読み取られません。