5

次のように、sscanf を使用して文字列から name と msg の特定の値を抽出しようとして{"username":"ece","says":"hello"}います。

sscanf(data, "{"\username"\:"\%s"\,"\says"\:"\%s"\}", name, msg);

名前に「ece」、msg に「hello」が必要ですが、名前に ece","says":"hello" が表示され、msg は空のままです。

4

4 に答える 4

6

フォーマットは次の%s空白で停止します。で停止する'"'必要があるため、文字セットを使用する必要があります。

sscanf(data, "{\"username\":\"%[^\"]\",\"says\":\"%s\"}", name, msg);
                              ^^^^^^
                          read up to the next double quote
于 2012-12-05T16:04:56.537 に答える
2

エスケープ文字の\ にエスケープを配置する必要があります。

sscanf(data, "{\"username\":\"%s\",\"says\":\"%s\"}", name, msg);

また、ユーザー名の後に空白がない限り、バッファ内のすべてが に読み込まれnameます。

次のように、%s の代わりに逆文字セットを使用します%[^\"]

于 2012-12-05T16:05:26.133 に答える
0

"\1)文字列全体の形式では、これを。で修正する必要があります\"。次の文字は特殊文字であり、\特殊文字であることに言及する"

%s2)と%[^\"]の両方をに置き換える必要がusernameありsaysます。上記の正規表現は、を含まない文字列をキャッチしたいことを意味します"。したがって、弦のキャッチは最初に停止します"

sscanf(s, "{\"username\":\"%[^\"]\",\"says\":\"%[^\"]\"}", name, msg);
于 2012-12-05T17:16:11.513 に答える
0

問題は、%s 変換指定が空白文字に到達するまで入力を読み取ることです。したがって、最初の変数の「ユーザー名」の後のすべてのデータがあります。

于 2012-12-05T16:05:34.323 に答える