如何从C中的char数组中删除前导“http://”?

时间:2011-11-01 15:27:09

标签: c string

我有一个传递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));
}

3 个答案:

答案 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仅在函数本身内部使用。