如何让sscanf在C中\ r \ n \ r \ n后开始扫描?

时间:2015-11-18 03:28:45

标签: c scanf

我正在用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);,但它不起作用。

3 个答案:

答案 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;
}