Dav*_*ide 8 c newline scanf eof
我需要解析来自这样的服务器的响应:
risposta:
200\n
Len 1040\n
Expire 30\n
\n
1111111111111111111111111\n
1111111111111111111111111\n
1111111111111111111111111\n
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用sscanf:
sscanf(risposta, "%d\nLen %d\nExpire %d\n\n%s[^\0]", &risp->type, &risp->len, &risp->expire, risp->risorsa);
Run Code Online (Sandbox Code Playgroud)
但它在risp-> risorsa只放了1111111111111111111111111.怎么解决?
Ps struct risp:
typedef struct Server_risp {
int type;
int expire;
int len;
int sup;
int inf;
char risorsa[5000];
}Server_risp;
Run Code Online (Sandbox Code Playgroud)
扫描集规范不是%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);
}
Run Code Online (Sandbox Code Playgroud)
结果:
1111111111111111111111111
1111111111111111111111111
1111111111111111111111111
Run Code Online (Sandbox Code Playgroud)
编辑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);
}
Run Code Online (Sandbox Code Playgroud)
......得到了相当多的预期结果:
| |
1111111111111111111111111
1111111111111111111111111
1111111111111111111111111
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6864 次 |
| 最近记录: |