получить конец веб-адреса в с? - PullRequest
1 голос
/ 02 декабря 2010

говорят, что я передаю аргумент www.bbc.co.uk/news/world-us-canada-11893886 Мне нужно отделить www.bbc.co.uk от / news / world-us-canada-11893886 для HTTP GET

Я пытался использовать strtok и strcat, но я сталкиваюсь со странными сплитами во время выполнения. Я могу получить www.bbc.co.uk просто отлично, используя strtok (host, "/");

Я попытался использовать комбинацию strtok и strcat, чтобы попытаться получить всю оставшуюся строку из первого "/", но я получаю вывод, подобный этому ... Запрос: da-11893886 tempString: новости / мир! хост: www.bbc.co.uk Путь: новости / мир! Da-11893886

Если вы посмотрите на этот вывод, самое странное в том, что он всегда вырезает среднюю часть. В этом случае "-us-cana"

раздел кода прилагается ниже

// testing purposes
 printf("argv[1]: %s\n", argv[1] );

 host = malloc(sizeof(argv[1]));
 strcpy(host, argv[1]);
 host = strtok(host, "/");

 // get the request
 request = malloc(sizeof(argv[1]) + sizeof(char)*6);

 char *tok, *tempString;
 tempString = malloc(sizeof(argv[1]));

 tok = strtok( NULL, "\0");

 while( tok ) {
  strcpy(tempString, tok);
  printf("request: %s\n", request);
  request = strcat(tempString, request);
  tok = strtok(NULL, "\0");
 }

 printf("host: %s\n", host);
 printf("Path: %s\n", request);

Спасибо за просмотр. Любое направление или даже ссылка на сайт, где я могу выяснить, как это сделать, будет высоко ценится.

Ответы [ 4 ]

1 голос
/ 02 декабря 2010

Вот код, который делает больше, чем вы хотите.Обратите внимание, что это изменяет исходную строку - вместо этого вы можете сделать копии:

void split_request(char *request, char **protocol, char **addr, char **path)
{
  char *ptr = strstr(request, "://");

  if(NULL == ptr)
  {
    *protocol = NULL;
    *addr = request;
  }
  else
  {
    *protocol = request;
    *addr = ptr + 3;
    *ptr = '\0';
  }

  ptr = strchr(*addr, '/');
  if(NULL == ptr)
  {
    *path = NULL;
  }
  else
  {
    *path = ptr + 1;
    *ptr = '\0';
  }
}

Пожалуйста, извините за любые опечатки / очевидные ошибки.Я набираю это в спешке, потому что у меня есть работа: P Это должно помочь вам начать.

0 голосов
/ 02 декабря 2010
 I have modified your code to work the way you are expecting
 main(int argc, char *argv[])
    {
    char *request,*host,*req;
     char *tok, *tempString;
    printf("argv[1]: %s\n", argv[1] );

    host = malloc(strlen(argv[1]));
     strcpy(host, argv[1]);
     host = strtok(host, "/");


     tempString = malloc(strlen(argv[1]));

     tok = strtok( NULL, "\0");
     printf("sizeof(tok) %d\n",strlen(tok));
      strncpy(tempString, tok,strlen(tok));

     while( tok ) {
      tok = strtok(NULL, "\0");
      if (tok != NULL) {
      strncat(tempString, tok,strlen(tok));
      }else {
       break;
      }
     }
     request = tempString;
     printf("host: %s\n", host);
     printf("Path: %s\n", request);
    }
    ~

выход

./tmp www.bbc.co.uk/news/world-us-canada-11893886/tmp.htmlargv[1]: www.bbc.co.uk/news/world-us-canada-11893886/tmp.html
sizeof(tok) 38
host: www.bbc.co.uk
Path: news/world-us-canada-11893886/tmp.html
bash-2.03$ 

~

0 голосов
/ 02 декабря 2010

strrchr () возвращает LAST-экземпляр символа.Ему нужен ПЕРВЫЙ экземпляр после любой строки http: //.

Ответ прост:

char * address_start = strchr (in_string + 8, '/');

Если это не NULl, тогда вы находитесь на первом / пути.

Почему +8?Поскольку "https://" имеет длину 8 символов и даже если в начале его нет" http://", ни один IP-адрес или веб-адрес не может быть меньше 8 символов.Даже «abcd» имеет длину 7 символов, и я не верю, что цифровая запись с точками IPv4 имеет публичный адрес со всеми однозначными цифрами.Я могу ошибаться, хотя.Возможно, стоит сначала проверить строку, чтобы проверить, достаточно ли она длинна.

В любом случае, вы всегда можете предварительно проверить строку, чтобы увидеть, начинается ли она с «http» или нет, чтобы определить смещение, с которого нужно начинать поиск.

0 голосов
/ 02 декабря 2010

Используйте strrchr(), чтобы найти последнее вхождение '/' сзади. После этого у вас будет указатель на начало «конца веб-адреса», если вы добавите его к возвращенному указателю.

Обновление

Если ваш URL не начинается с http://, это должно сработать

#include <stdio.h>
#include <string.h>

int main(void)
{
    char url[] = "www.bbc.co.uk/news/world-us-canada-11893886";
    int  cnt;
    char host[100];
    char path[100];
    char request[100];

    strcpy(request, strrchr(url, '/'));

    strcpy(host, url);
    host[cnt = strcspn(url, "/")] = '\0';

    strcpy(path, &url[cnt]);

    printf("host: %s\npath: %s\nrequest: %s\n", host, path, request);

    return 0;
}

выход

$ ./a.out
host: www.bbc.co.uk
path: /news/world-us-canada-11893886
request: /world-us-canada-11893886
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...