Как удалить ведущий «http: //» из массива символов в C?

#c #string

#c #строка

Вопрос:

У меня есть функция (на C), которой передается URL. Эта функция работает только в том случае, если параметр URL имеет форму www.example.com , а не когда он есть http://www.example.com .

Я хотел бы изменить эту функцию так, чтобы при передаче URL-адреса в форме http://www.example.com он удалял ведущий 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));
}
 

Ответ №1:

Всегда есть простой подход:

 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
 

Ответ №2:

 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, вы могли бы просто извлечь часть между :// и следующей / (если она существует). Если часть хоста содержит a @ , имя хоста начинается справа от этого символа. Особым случаем является file:///xyz , который приведет к нулевой строке и должен вернуться localhost .

Ответ №3:

Просто сравните первые семь символов массива, чтобы увидеть, соответствует ли он «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] = ''; //NULL-terminate the string

if (strcmp(http_header, "http://") == 0)
    final_url = amp;full_url[7];
else
    final_url = full_url;    
 

Единственное, с чем следует быть осторожным в этом коде, это то, что все, на что final_url указывает, имеет срок службы, превышающий срок службы final_url … в противном final_url случае он больше не будет указывать на действительную память. Это не должно быть проблемой, хотя внутри функции, которой передается указатель на строку, where final_url используется только внутри самой функции.