扫描集规范不是%s[whatever]
,它只是%[whatever]
,所以你的格式字符串应该更像:"%d\nLen %d\nExpire %d\n\n%[^\0]"
。
作为旁注,scanf
朋友认为格式字符串中的任何空格都等效于任何其他空格——格式中的任何空格都匹配输入中的任意空格字符序列(并且换行符被认为是空格)。您当前的格式字符串很好地记录了您期望的格式,但从它真正匹配的角度来看,您可以将其更改为:"%d Len %d Expire %d %[^\0]"
而不影响它将做什么。特别是,您连续的两条换行符并没有真正取得太大成就。
编辑:考虑一下,[\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