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