код реализует функцию, которая считывает файл (содержит много URL-адресов), каждый URL-адрес проходит через «evhttp_uri_parse», получая хост и путь. Но у него есть ошибка, из-за которой ошибка анализа evhttp_uri_parse не возвращается, возвращает NULL. Возможно, причиной является переполнение стека.переполнение стека (около «evhttp_uri_parse»)
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);
У вас есть определенный URL-адрес, который вызывает ошибку? – tripleee
NO. Все общее. – sanwuhai
Кавычки в 'printf()' after 'if (fp == NULL)' неуместны; вы хотите закрыть цитату после новой строки ('\ n'). Сообщения об ошибках обычно должны печататься со стандартной ошибкой, а не с стандартным выходом. –