url截断技术巧用指针

使用url截断的时候,我们一般希望从url得到site、port、path。这是最节省内存的方法就是巧用内存。


举个例子。一个url   :http://write.blog.csdn.net/postedit?ref=toolbar

传进来一个url,我们直接把port与path的分界线"/"的值返回path(指针),得到了path然后把"\"写成“\0”。

然后把":"后一位的数字传给port因为之前的\已经被写成\0了,所以这里能直接得到8080.再把:写成\0.

最后直接把url+7转给site就能得到  write.blog.csdn.net

至此,没有创建新的内存直接截断url。


具体实现如下:

int x_parse_url(const char *input, char *site, char *port, char *path)
00766 {
00767     char              tmp[GL_MAX_URL_LEN];
00768     char              *pin = tmp;
00769     char              *p, *q;
00770     char              *p_query = NULL;
00771     if (strlen(input) >= GL_MAX_URL_LEN)
00772     {
00773         write_log(GL_LOG_DEBUG, "x_parse_url: url is too long");
00774         return 0;
00775     }
00776     strcpy(tmp, input);
00777     x_delete_inter(tmp);
00778     if (strncasecmp(pin, "http://", 7) == 0)
00779     { pin += 7; }
00780     //get path
00781     p = strchr(pin, '/');
00782     p_query = strchr(pin, '?');
00783     if (NULL == p)
00784     {
00785         p = p_query;
00786     }
00787     if ((NULL != p_query) && (p_query <= p))
00788     {
00789         if (path != NULL)
00790         {
00791             path[0] = '\0';
00792             if (strlen(p_query) < GL_MAX_PATH_LEN - 1)
00793             {
00794                 strncpy(path, "/", 2);
00795                 strcat(path, p_query);
00796             }
00797             else
00798             { return 0; }
00799         }
00800         *p_query = '\0' ;
00801     }
00802     else
00803     {
00804         if (p != NULL)
00805         {
00806             if (path != NULL)
00807             {
00808                 path[0] = '\0';
00809                 if (strlen(p) < GL_MAX_PATH_LEN)
00810                 { strcpy(path, p); }
00811                 else
00812                 { return 0; }
00813             }
00814             *p = '\0';
00815         }
00816         else
00817         {
00818             if (path != NULL)
00819             {
00820                 strcpy(path, "/");
00821             }
00822         }
00823     }
00824     q = strchr(pin, ':');
00825     //get port
00826     if (q != NULL)
00827     {
00828         if (port != NULL)
00829         {
00830             port[0] = '\0';
00831             if (strlen(q) < GL_MAX_PORT_LEN && atoi(q + 1) > 0)
00832             {
00833                 strcpy(port, q + 1);
00834             }
00835             else
00836             { return 0; }
00837         }
00838         *q = '\0';
00839     }
00840     else
00841     {
00842         if (port != NULL)
00843         { port[0] = '\0'; }
00844     }
00845     //check if the default port
00846     if ((port != NULL) && (strncmp(port, "80", 3)) == 0)
00847     {
00848         port[0] = 0;
00849     }
00850     //get site
00851     if (site != NULL)
00852     {
00853         site[0] = '\0';
00854         if (pin[0] != '\0' && strlen(pin) < GL_MAX_SITE_LEN)
00855         {
00856             strcpy(site, pin);
00857         }
00858         else
00859         {
00860             write_log(GL_LOG_DEBUG, "x_parse_url: site name too long or empty url[%s]", pin);
00861             return 0;
00862         }
00863     }
00864     return 1;
00865 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值