10

次のようなサーバーからの応答を解析する必要があります。

リポスタ:

200\n
Len 1040\n
Expire 30\n
\n
1111111111111111111111111\n
1111111111111111111111111\n
1111111111111111111111111\n

私はsscanfで試しています:

sscanf(risposta, "%d\nLen %d\nExpire %d\n\n%s[^\0]", &risp->type, &risp->len, &risp->expire, risp->risorsa);

しかし、risp->risorsa には 111111111111111111111111 しか入れません。解決方法は?

Ps struct risp:

typedef struct Server_risp {
   int type;
   int expire;
   int len;
   int sup;
   int inf;
   char risorsa[5000];
 }Server_risp;
4

3 に答える 3

7

scanset 仕様は ではなく%s[whatever]、単なる%[whatever]であるため、フォーマット文字列は次のようにする必要があります"%d\nLen %d\nExpire %d\n\n%[^\0]"

余談ですが、フォーマット文字列内の空白は他の空白と同等であると考えてください。scanfフォーマット内の空白は、入力内の空白文字の任意のシーケンスに一致します (改行は空白と見なされます)。現在のフォーマット文字列は、期待するフォーマットを文書化するのに適していますが、実際に何が一致するかという観点からは、次のように変更でき"%d Len %d Expire %d %[^\0]"ます。特に、2 つの連続する改行はあまり効果がありません。

編集: 考えてみると[\0]、少し問題が発生します。「\0」が文字列を終了するため、スキャン セットの指定が無効になります。残りの入力を に入れたいだけなので、risorsaおそらく : を使用するのが最も簡単%cです"%d Len %d Expire %d %4999c"

はい、今回は実際にテストしました。

#include <stdio.h>

char *riposta = "200\n"
    "Len 1040\nExpire 30\n"
    "\n1111111111111111111111111\n"
    "1111111111111111111111111\n"
    "1111111111111111111111111\n";

typedef struct Server_risp {
    int type;
    int expire;
    int len;
    int sup;
    int inf;
    char risorsa[5000];
}Server_risp;

int main() {
    Server_risp risp;
   sscanf(riposta, "%d Len %d Expire %d %4999c", &risp.type, &risp.len, &risp.expire, risp.risorsa);

   printf("%s\n", risp.risorsa);
}

結果:

1111111111111111111111111
1111111111111111111111111
1111111111111111111111111

編集 2: ここでどのような問題が発生しているのか正確にはわかりません。先頭と埋め込まれた空白の両方を読み取るように少し変更しました。

#include <stdio.h>

char *riposta = "200\n"
"Len 1040\nExpire 30\n"
"|        |"
"\n1111111111111111111111111\n"
"1111111111111111111111111\n"
"1111111111111111111111111\n";

typedef struct Server_risp {
    int type;
    int expire;
    int len;
    int sup;
    int inf;
    char risorsa[5000];
}Server_risp;

int main() {
    Server_risp risp;
    sscanf(riposta, "%d Len %d Expire %d%4999c", &risp.type, &risp.len, &risp.expire, risp.risorsa);

    printf("%s\n", risp.risorsa);
}

...そして、ほぼ期待どおりの結果が得られました。

|        |
1111111111111111111111111
1111111111111111111111111
1111111111111111111111111
于 2012-04-07T14:19:41.353 に答える
-1

次のコードにはいくつかの問題があります。

sscanf(risposta, "%d\nLen %d\nExpire %d\n\n%s[^\0]", &risp->type, &risp->len, &risp->expire, risp->risorsa);

そのはず:

char tmp_str[100]; 

sscanf(risposta, "%d %s %d %s %d %s[^\0]", &risp->type, tmp_str, &risp->len, tmp_str, &risp->expire, risp->risorsa);

文字列 "Len" と "Expire" を処理する必要がありますが、sscanf では処理できません。

于 2012-04-07T14:12:08.150 に答える