一个扫描集规范不是
%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
%c
前面的空格,这样就像 "%d Len %d Expire %d%4999c"。 - Jerry Coffin