sscanf和换行符

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)

Jer*_*fin 7

扫描集规范不是%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)