C初学者:字符串解析

时间:2011-12-06 11:24:35

标签: c string parsing

我正在尝试解析以下HTTP响应:

HTTP/1.1 200 OK
Date: Tue, 06 Dec 2011 11:15:21 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.9
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 48
Content-Type: text/html

��(�ͱ���I�O����H�����ч��
                      �4�@�B�$���S

我想提取“48”和二进制内容。

这是我尝试过的东西:

  //char* str contains the response
  char * pch;
  printf ("Splitting response into tokens:\n");
  pch = strtok (str,"\r\n");
  while (pch != NULL)
  {
      printf ("%s\n",pch);
      pch = strtok (NULL, "\r\n");
  }

但我现在有点困惑......非常感谢任何帮助。


编辑:

这是我做过的事情:

char* pch;
char* pch2;
pch=strstr(buf,"Content-Length:");
pch2=strstr(pch,"\r\n");

我怎样才能得到这两个指针之间的位?


编辑:解决方案:

        char* pch;
        char* pch2;
        pch=strstr(buf,"Content-Length:");
        int i=0;
        char contLen[20];
        for(i=0;i<20;i++){
                char next=pch[strlen("Content-Length:")+i];
                if(next=='\r' || next=='\n'){
                        break;
                }
                contLen[i]=next;
        }
        printf("%d\n",atoi(contLen));

2 个答案:

答案 0 :(得分:6)

为什么不改为搜索字符串"Content-Length:"?然后从那时起前进。

您可以使用 strstr() str 中查找点,然后将char指针向前移动 strlen(“Content-Length:”) position,然后使用 atoi()

读取值

无需将整个字符串标记为

答案 1 :(得分:2)

试试这个:

const char* http_header = 
"HTTP/1.1 200 OK\r\n" \
"Date: Tue, 06 Dec 2011 11:15:21 GMT" \
"Server: Apache/2.2.14 (Ubuntu)\r\n" \
"X-Powered-By: PHP/5.3.2-1ubuntu4.9\r\n" \
"Vary: Accept-Encoding\r\n" \
"Content-Encoding: gzip\r\n" \
"Content-Length: 48\r\n" \
"Content-Type: text/html\r\n\r\n" \
"mydata";

// will point to start of data
char* pdata = strstr((char*)http_header,"\r\n\r\n");
    // will point to start of 'Content-Length' header
char* pcontent = strstr((char*)http_header,"Content-Length:");
    // get the length of the data
int value = atoi(pcontent+15);