我目前有一个基本上从网页上读取html的程序。在向Web服务器发送http请求后,我得到一个响应,我使用fdopen来读取套接字:
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下找到这个换行符,并在找到这个换行符时插入一些东西(基本上在打印头文件后立即执行操作。但是,我不确定如何找到该行,或者是什么^ Ms是为。
目前我正在尝试像
这样的事情if(newline == "\r\n"){
...
}
或只是“\ n”,它不起作用。我认为它与^ M有关,但我不确定。
谢谢!
答案 0 :(得分:1)
对于标题,HTTP使用回车符+换行符对来标记行尾 - 所以你看到的'^ M'是回车符。如果特定应用程序允许,则在标题之后,正文中的行结尾可能会有不同的标记。
标题的末尾用空行标记,因此该行的第一个字符是回车符(甚至其他空格也不能出现在它之前)。所以当你第一次找到'\ r'作为一行的第一个字符时,你就找到了标题的结尾;所有剩余的线都是身体的一部分。
if(newline == "\r\n"){
无法正常工作,因为您无法以这种方式比较字符串 - 您正在检查newline
指向的地址是否与字符串文字{{1}的地址相等},即使"\r\n"
中的字符匹配也是假的。 newline
或strcmp()
会起作用,但由于它只有两个字符,您可以单独比较它们(甚至可能更快)。你也不太可能在行结束之外得到strncmp()
,所以你可能只是检查它是否安全。
如果'\r'
足够大以容纳任何标题行,则以下大致概述了要做的事情(至少一种方法):
buf
答案 1 :(得分:0)
^ M(Ctrl + M)是ascii carrige返回,相信你只能搜索\ r而不是\ r \ n
我认为理想情况下你想要进行正则表达式检查,并在行的开头检查一个新的行字符,即^ \ n或者你可以检查.length并查看它是否包含一个新行,如果它为0。你只是想确保你没有抓到任何虚假的假设。
答案 2 :(得分:0)
那些^M
是Windows换行符。或者说是ASCII CR。请尝试仅搜索\r
而不是\r\n
。