#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
используется только внутри самой функции.