次のように、sscanf を使用して文字列から name と msg の特定の値を抽出しようとして{"username":"ece","says":"hello"}
います。
sscanf(data, "{"\username"\:"\%s"\,"\says"\:"\%s"\}", name, msg);
名前に「ece」、msg に「hello」が必要ですが、名前に ece","says":"hello" が表示され、msg は空のままです。
フォーマットは次の%s
空白で停止します。で停止する'"'
必要があるため、文字セットを使用する必要があります。
sscanf(data, "{\"username\":\"%[^\"]\",\"says\":\"%s\"}", name, msg);
^^^^^^
read up to the next double quote
エスケープ文字の\
前にエスケープを配置する必要があります。
sscanf(data, "{\"username\":\"%s\",\"says\":\"%s\"}", name, msg);
また、ユーザー名の後に空白がない限り、バッファ内のすべてが に読み込まれname
ます。
次のように、%s の代わりに逆文字セットを使用します%[^\"]
"\
1)文字列全体の形式では、これを。で修正する必要があります\"
。次の文字は特殊文字であり、\
特殊文字であることに言及する"
%s
2)と%[^\"]
の両方をに置き換える必要がusername
ありsays
ます。上記の正規表現は、を含まない文字列をキャッチしたいことを意味します"
。したがって、弦のキャッチは最初に停止します"
sscanf(s, "{\"username\":\"%[^\"]\",\"says\":\"%[^\"]\"}", name, msg);
問題は、%s 変換指定が空白文字に到達するまで入力を読み取ることです。したがって、最初の変数の「ユーザー名」の後のすべてのデータがあります。