2011-11-01 88 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僅用於函數內部。