2011-11-18 29 views
1

我目前有一个基本上从网页读取html的程序。发送Web服务器的HTTP请求后,我回来,我用fdopen读取插座的响应:在HTTP响应中寻找换行符

FILE *webpage = fdopen(socket, "r"); 

然后我有一个使用与fgets让每一行,然后将它们打印到文件的循环:

while(!feof(webpage)){ 
    fgets(newline, 1000, webpage); 
    fprintf ... 
} 

计划的这部分工作得很好,而我最终得到了一些测试文件,如:

HTTP/1.1 200 OK^M 
Date: Fri, 18 Nov 2011 04:42:40 GMT^M 
Server: Apache/2.2.14^M 
Accept-Ranges: bytes^M 
Cache-Control: max-age=0^M 
Expires: Fri, 18 Nov 2011 04:42:40 GMT^M 
Vary: Accept-Encoding^M 
Content-Length: 345235^M 
Connection: close^M 
Content-Type: text/html^M 
X-Pad: avoid browser bug^M 
^M 
<html lang="en"> 
<head> 
... 

我想找到这个新行是正确下的XPad,并插入正确的事情WH发现这个换行符(基本上在打印标题后做一些事情。但是,我不知道如何找到该行,或者^ Ms是什么。

if(newline == "\r\n"){ 
    ... 
} 

或只是 “\ n” 目前,我想要的东西,这是行不通的。我认为它与^ M有关,但我不确定。

谢谢!

+0

为什么不换行字符10的ASCII值?而不是“\ n”? – niko

+0

无论'x'是什么,表达式'x ==“\ r \ n”'在C中几乎总是错误的。符合标准的编译器甚至可以用0代替整个表达式。查看如何比较C中的字符串。 –

回答

0

^M(按Ctrl + M)是ASCII carrige回报,我相信你可以搜索只是\ r和不\ r \ n

我觉得最好你想要做一个正则表达式检查,并检查是否有换行开始的新行字符,例如^ \ n另外,您可以检查.length并查看它是否包含一个新行,如果它的值为0.您只是想确保不会发现任何错误的位置。

0

那些^M是Windows换行符。或者是ASCII CR。尝试仅搜索\r而不是\r\n

1

对于标题,HTTP使用回车+换行对标记行结束 - 因此,您看到的“^ M”是回车符。如果特定的应用程序允许,标题后面的主体中的行结束可能会标记为不同。

标题的结尾用空行标记,所以该行的第一个字符就是回车符(甚至不会出现其他空白符)。所以当你第一次找到'\ r'作为一行的第一个字符时,你已经找到了标题的结尾;所有其余的线都是身体的一部分。

if(newline == "\r\n"){不起作用,因为你不能比较字符串这样 - 你正在检查的地址指向newline与字符串文字"\r\n"的地址,这将是错误的平等,即使在人物newline匹配。 strcmp()strncmp()可以工作,但由于它只有两个字符,你可以单独比较它们(甚至可能更快)。这也很不可能在一行结束之后得到'\r',所以你可能是安全的,只是为此进行检查。

如果buf是大到足以容纳任何标题行,下面大致勾勒做什么(一个方法,至少):

char buf[BUFSZ]; 
// ... 
while(fgets(buf, BUFSZ, sock)) { 
    if (buf[0] == '\r') { // or (buf[0] == '\r' && buf[1] == '\n') to be strict 
    // DO STUFF for end of header section 
    break; 
    } else { 
    // DO STUFF for a header line 
    } 
} 
// if needed, get rest of document 
while(fgets(buf, BUFSZ, sock)) { 
    // DO STUFF for a body line 
}