代码实现读取文件(包含大量url)的功能,每个url都通过“evhttp_uri_parse”获取主机和路径。但是它有一个错误,evhttp_uri_parse解析失败,返回NULL。可能的原因是堆栈溢出。
FILE *fp=fopen(argv[1],"rb");
if(NULL==fp)
{
printf("open url_file is error %d::%s\n",errno,strerror(errno));
return 0;
}
char url_buf[2048];
memset(url_buf,'\0',sizeof(url_buf));
fgets(url_buf,sizeof(url_buf),fp);
while(!feof(fp))
{
if(strlen(url_buf)>1)
{
printf("url_buf::%s",url_buf);
#if 1
struct evhttp_uri *ev_uri=NULL;
ev_uri=evhttp_uri_parse(url_buf);
if(ev_uri==NULL)
{
printf("parse uri error::%d,%s\n",errno,strerror(errno));
}
const char *host=evhttp_uri_get_host(ev_uri);
const char *path=evhttp_uri_get_path(ev_uri);
printf("query host::%s,path::%s\n",host,path);
evhttp_uri_free(ev_uri);
#endif
}
memset(url_buf,'\0',sizeof(url_buf));
fgets(url_buf,sizeof(url_buf),fp);
}
fclose(fp);
答案 0 :(得分:0)
fgets(url_buf,sizeof(url_buf)+1,fp)
应更改为fgets(url_buf,sizeof(url_buf),fp)
fgets
添加' \ n'在字符串的末尾。尝试删除它,看看它是否有帮助。
答案 1 :(得分:0)
如果您的网址因任何原因超过2048个字符大小,那么fgets
将无法完全返回您想要的网址,并在2048位置返回一部分字符(带有2047字符)和空字符仅
这就是为什么放sizeof(url_buf)+1
是个坏主意。它将导致未定义的行为,因为您将访问一个超出url_buf
数组的位置。
所以检查你是否有一个带换行符的字符串并将其更改为空字符,如果你没有在字符串中得到一个换行符,那么你可能想要阅读,直到你得到一个换行符来获得完整的url。
仅当您的网址由换行符分隔时才适用。