2

我在解析 http 标头时遇到了一些麻烦。

这是我的问题:

char resp[] = "HTTP/1.1 200 OK\r\n"
             "Content-Type: text/html\r\n"
             "Content-Length: 4\r\n"
             "\r\n"
             "text";

// some stuff
sscanf(resp, "HTTP/%f %d\r\n",&version,&code);
sscanf(resp, "%*[^]Content-Length: %d",&size);
//            ^ tried several things here

我认为使用 sscanf 是一个好主意,因为我只想获得一些值(如果它们存在)。
我的想法是跳过所有我不想要的标题。

我的问题是:
1-sscanf 是个好主意吗?
2-如果不是什么方法会更好

谢谢你。

4

3 回答 3

3

第一次订购不应该使用这些*scanf功能。

解析 HTTP 标头比看起来要困难得多。我会先看看是否libcurl已经实现了你可以使用的东西,如果没有,直接去flexand bison

于 2012-07-18T01:44:07.787 回答
1

使用库的好处是您不必了解它们是如何工作的。

使用库的问题在于您不必了解它们是如何工作的。

无论您的应用程序是否必须响应某些限制(考虑到服务器的安全性和速度),您都必须在实现细节上花费更多时间——这意味着了解问题,以便找到合适的解决方案。

这就是编程的全部意义所在。

提示:使用库可能是处理 HTTP 标头解析的最佳方法。

于 2012-07-18T08:25:08.133 回答
0

第一个答案:不要这样做。有足够多的奇怪的 HTTP 编码和大小写映射以及其他奇怪的东西,你自己可能会弄错。但是,如果您忽略这个好建议,那么...

第二个答案:不要使用 sscanf。它总是以泪水告终。考虑将字符串放入正则表达式库并捕获您想要的内容,或者逐行解析字符串。您可以为 "\r\nContent-Length:" 执行 strstr ,但这不会在标题的末尾停止,并且可能会匹配正文中意外的内容。您可以先搜索 \r\n\r\n 并找出结束的位置,然后执行 strstr 直到那时,但此时您正在双重搜索。

于 2012-07-18T01:44:20.313 回答