我正在用C编写HTTP客户端/服务器,我想将内容(而不是http标头)读入字符串。因为标题中的最后一个是\ r \ n \ r \ n序列,我需要告诉sccanf跳过所有内容直到\ r \ n \ r \ n,然后开始扫描\ r \ n之后的第一个字符串\ r \ n。我从来没有真正理解复杂的printf和scanf格式描述符,每次我尝试阅读文档时都会很快感到困惑。我最好的尝试是sscanf(str, [^\r\n\r\n]%s, mystr);
,但它不起作用。
答案 0 :(得分:0)
scanf的语法与printf的语法几乎相同。因此,您想要使用的是:
sscanf(str, "%s\r\n\r\n%s", dummystr, mystr);
当然,你需要将dummystr和mystr分配到足够大以避免缓冲区溢出(strlen(str)将为两者做)。
答案 1 :(得分:0)
这样的事情:
#include <stdio.h>
int main()
{
char const* testString = "abcd\r\n\r\nthe rest";
char str[20] = {};
sscanf(testString, "%*[^\r\n]%*[\r]%*[\n]%*[\r]%*[\n]%[^\n]", str);
printf("%s\n", str);
}
输出:
the rest
格式字符串的说明:
"%*[^\r\n]%*[\r]%*[\n]%*[\r]%*[\n]%[^\n]"
|<- ->| Read and discard everything that is not a \n or \r
"%*[^\r\n]%*[\r]%*[\n]%*[\r]%*[\n]%[^\n]"
|<-->| Read and discard the first \r
"%*[^\r\n]%*[\r]%*[\n]%*[\r]%*[\n]%[^\n]"
|<-->| Read and discard the first \n
"%*[^\r\n]%*[\r]%*[\n]%*[\r]%*[\n]%[^\n]"
|<-->| Read and discard the second \r
"%*[^\r\n]%*[\r]%*[\n]%*[\r]%*[\n]%[^\n]"
|<-->| Read and discard the second \n
"%*[^\r\n]%*[\r]%*[\n]%*[\r]%*[\n]%[^\n]"
|<-->| Read and save all the characters until the next \n
答案 2 :(得分:0)
使用状态机可能采用不同的方法
const char *rnrn(const char *s) {
const char *pat = "\r\n\r\n";
int ch;
int i = 0;
while (i<4) {
ch = *s++;
if (ch == '\0') return NULL;
if (ch == pat[i]) i++;
else if (ch == pat[0]) i = 1;
else i = 0;
}
// Success ....
return s;
}