我有一个传递URL的函数(在C中)。此功能仅在URL参数采用www.example.com
形式时有效,而不是http://www.example.com
时。
我想修改此函数,以便在以http://www.example.com
的形式传递URL时,它会删除前导http://
(如果存在),以便它可以正常运行。
我如何在C中执行此操作?
这是有问题的功能(让我知道是否有更好的方法):
char* get_ip (char* url)
{
struct hostent* h;
if ((h = gethostbyname(url)) == NULL)
return NULL;
return inet_ntoa(*((struct in_addr*)h->h_addr));
}
答案 0 :(得分:4)
总有一种简单的方法:
char *url;
// ...
const char *http = "http://";
if (!strncmp(url, http, strlen(http)))
url += strlen(http);
或者,如果您想要删除该表单的协议说明符(例如,https):
char *url;
char *p = strstr(url, "://");
if (p)
url = p + 3; // skip past :// part of URL
答案 1 :(得分:3)
char* get_ip (char* url)
{
struct hostent* h;
if (strncasecmp(url, "http://", 7) == 0)
url += 7;
else if (strncasecmp(url, "https://", 8) == 0)
url += 8;
if ((h = gethostbyname(url)) == NULL)
return NULL;
return inet_ntoa(*((struct in_addr*)h->h_addr));
}
答案 2 :(得分:2)
只需比较数组的前七个字符以查看它是否与“http://”匹配,如果是这种情况,则在该点之后立即拆分字符串。所以你可以做到以下几点:
char* full_url = "http://www.example.com";
char* final_url = NULL;
//copy the header into a temporary buffer
char[8] http_header;
strncpy(http_header, full_url, sizeof(http_header));
http_header[7] = '\0'; //NULL-terminate the string
if (strcmp(http_header, "http://") == 0)
final_url = &full_url[7];
else
final_url = full_url;
使用此代码时唯一要注意的是,无论final_url
指向的是什么,其寿命都会超过final_url
的生命周期......否则final_url
将不会再次指向有效的记忆。这不应该是一个问题,虽然在传递指向字符串的指针的函数内部,final_url
仅在函数本身内部使用。