Как убрать ведущий "http://" из массива символов в C? - PullRequest
1 голос
/ 01 ноября 2011

У меня есть функция (в 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));
}

Ответы [ 3 ]

4 голосов
/ 01 ноября 2011

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

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 голосов
/ 01 ноября 2011
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 голосов
/ 01 ноября 2011

Просто сравните первые семь символов массива, чтобы увидеть, соответствует ли он "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 используется только внутри самой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...