2015-02-11 238 views
0

代码实现读取文件(包含大量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); 
+0

您是否有触发错误的特定URL? – tripleee 2015-02-11 06:37:55

+0

NO。一切都是一般的。 – sanwuhai 2015-02-11 06:46:05

+0

'if(fp == NULL)'之后的'printf()'中的引号放错位置;你想要在换行符('\ n')后面加上关闭引号。错误消息通常应打印到标准错误,而不是标准输出。 – 2015-02-11 07:02:15

回答

0
  1. fgets(url_buf,sizeof(url_buf)+1,fp)应改为fgets(url_buf,sizeof(url_buf),fp)

  2. fgets在字符串的末尾添加 '\ N'。尝试删除它,看看它是否有帮助。

+0

NO。 Sill有错误。 – sanwuhai 2015-02-11 06:50:49

+1

@sanwuhai:user4419802指出了一个真正的问题。这可能不是你的主要问题,但这是一个应该解决的真正问题。 – 2015-02-11 07:03:36

+0

@Jonathan Leffler。为你提供建议。 – sanwuhai 2015-02-11 07:23:14

0

如果您的网址以任何理由超过2048字符大小,然后fgets不会完全恢复你你想要的网址,并用一个空字符在2048'th位置返回你它的一部分(与2047字)只要。

所以这就是为什么把sizeof(url_buf)+1是一个坏主意。它会导致未定义的行为,因为您将访问的位置超出了url_buf阵列的范围。

所以检查你是否得到了带有换行符的字符串,并将其改为空字符,如果你没有在字符串中得到换行符,那么你可能想要阅读,直到你得到一个换行符来获得完整的url 。

这仅适用于您的网址是由换行符分隔的情况。

+0

感谢您的建议,但主要原因不是要素。 – sanwuhai 2015-02-12 01:00:34

+0

@sanwuhai你应该发布错误和你得到的输出,所以我们可以知道,你面临什么问题,我们发布解决方案,假设函数'evhttp_uri_parse(url_buf)'工作正常,并且唯一的方法它可能会出错是因为输入错误。 – Sridhar 2015-02-12 08:05:31