2011-11-01 87 views
1

我有一个函数(在C中)传递一个URL。此功能仅适用于URL参数的形式为www.example.com,而不是http://www.example.com如何从C中的char数组中删除前导“http://”?

我想修改这个函数,这样当以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)); 
} 

回答

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 
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)); 
} 
+1

为了得到它工作其他的方案如ftp也可以简单地在'://'和下一个'/'之间提取(如果存在的话)。如果主机部分包含“@”,则主机名将从该字符开始。一个特殊的情况是file:/// xyz,它会导致一个空字符串并返回'localhost'。 –

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仅用于函数内部。