我使用 atoi() 从 header 获取状态代码,但它不适用于以下输入:
"404 Not Found\r\n内容类型: text/html\r\n日期: 2013 年 12 月 12 日星期四 20:53:22 GMT\r\n连接: 关闭\r\n\r\n “
它不应该在第一个非数字字符处停止读取吗? 如上所述:http://www-control.eng.cam.ac.uk/~pcr20/www.cppreference.com/stdstring_details.html
atoi() will stop reading from str as soon as a non-numerical character has been read
根据调试器,发生段错误的代码:
__NTH (atoi (const char *__nptr))
{
return (int) strtol (__nptr, (char **) NULL, 10);
}
这是 stdlib.h 中的第 280 行,__nptr 的值为:
__nptr " 404 Not Found\r\nContent-type: text/html\r\nDate: Thu, 12 Dec 2013 20:53:22 GMT\r\nConnection: close\r\n\r\n" char *
<小时/>
我想指出以下输入工作正常(没有段错误):
__nptr " 404 Not Found\r\nContent-Type: text/html; charset=UTF-8\r\nX-Content-Type-Options: nosniff\r\nDate: Thu, 12 Dec 2013 21:13:24 GMT\r\nServer: sffe\r\nContent-Length: 943\r\nX-XSS-Protection: 1; mode=block\r\nAlternate-Protocol: 80:quic\r\n\r\n" char *
__nptr " 302 Found\r\nCache-Control: no-cache, no-store, must-revalidate\r\nPragma: no-cache\r\nExpires: 0\r\nLocation: http://br.godaddy.com/\r\nServer: Microsoft-IIS/7.0\r\nSet-Cookie: MemBotChk=false; path=/\r\nSet-Cookie: countrysite1=www; domain=godaddy.com; expires=Fri, 12-Dec-2014 21:15:09 GMT; path=/\r\nSet-Cookie: language1=pt-BR; domain=godaddy.com; expires=Fri, 12-Dec-2014 21:15:09 GMT; path=/\r\nP3P: policyref="/w3c/p3p.xml", CP="COM CNT DEM FIN GOV INT NAV ONL PHY PRE PUR STA UNI IDC CAO OTI DSP COR C..." char *
<小时/>
实际上,除了我一开始提到的输入之外,到目前为止所有输入都工作正常。 什么可能导致段错误?
删除前导空格没有什么区别。我还尝试在响应代码后添加一个空终止符,同样的事情发生了。所以我相信这不是atoi()
,而是其他东西。如何识别问题?
Valgrind 结果:
main.c:23 中 main 中大小 1 的读取无效
地址 0xf 未堆栈、分配或(最近)释放
- 1:__strtol_l_internal 在 /build/eglibc-hkB3nk/eglibc-2.17/stdlib/../stdlib/strtol_l.c:298
- 2: /usr/include/stdlib.h:280 中的 get_web_content
- 3: main.c:23 中的 main
main.c:23 只是对 get_web_content() 的调用
<小时/>问题是稍后使用空指针调用atoi()。
最佳答案
这确实是初学者的错误。为了为响应正文分配内存,我调用了 strcasestr 来查找 Content-Length: 字段。只是我没有检查该字段是否已找到。我不明白的是为什么调试器显示先前对 atoi() 的调用。
如果有同样问题的人偶然发现这个问题,这就是我做错的地方:
fill_this->content_length = atoi(strcasestr(header_string + i, "Content-Length:") + 15);
解决方案:
char *temp = strcasestr(header_string + i, "Content-Length:");
if(temp == NULL)
return;
fill_this->content_length = atoi(temp + 15);
关于C、atoi()产生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20554795/