首页 > 解决方案 > ssscanf 意外行为

问题描述

当我在 url http://www.website.com:30081/text.txt上使用 sscanf 时,如下所示:

int parse_url(char *url, requesthdrs *hdrs, char 
              *uri, char *domain_name) {    

   int request_port;                                                                 
   int host_hdr_len;                                                                 
   char temp[MAXLINE];                                                               
   size_t uri_len = 1;                                                               

   /* case 1: request_port specified */                                              
   /* format: http://domain_name:request_port/... */  

   if(sscanf(url, "http://%s:%d%s", domain_name, 
             &request_port, uri) == 3) {         
     fprintf(stderr, "case1\n");                                                     
     host_hdr_len = build_hosthdr(hdrs->host, 
                                domain_name, request_port);            
   }   

程序无法进入案例1,为什么会这样?

标签: csocketsioscanf

解决方案


读取直到第%s一个空格或字符串结尾。那不是你想要或需要的。请改用%[^:](匹配除冒号以外的任何内容的扫描集)。

小心缓冲区溢出。你不知道弦可以有多大。


推荐阅读