我在解析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 - 如果不是什么方法可以更好地工作
谢谢。
答案 0 :(得分:3)
首先订购永远不会使用*scanf
函数。
解析HTTP标头比看起来要困难得多。我首先会看到libcurl
是否已经实现了您可以使用的内容,如果失败,请直接转到flex
和bison
。
答案 1 :(得分:1)
使用库的好处是您无需了解它们的工作原理。
使用库的问题是您无需了解它们的工作原理。
您的应用程序是否必须响应某些约束(服务器会想到安全性和速度),您将不得不花更多时间在实现细节上 - 这意味着要了解问题,以便找到合适的解决方案。
这就是编程的全部内容。
提示:不使用库可能是解决HTTP标头解析的最佳方式。
答案 2 :(得分:0)
第一个答案:不要这样做。有足够奇怪的HTTP编码和案例映射以及其他奇怪的事情,你可能会自己做错了。但如果你忽略了这个好建议,那么......
第二个答案:不要使用sscanf。它总是以泪水结束。考虑将字符串放在正则表达式库中并捕获所需内容,或逐行解析字符串。您可以为“\ r \ nContent-Length:”执行strstr,但这不会在标题的末尾停止,并且可能与正文中的意外内容匹配。您可以首先搜索\ r \ n \ r \ n,然后找出结束的位置,然后在此之前执行strstr,但此时您正在进行双重搜索。