Как отделить домен и путь от URL в C? - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь прочитать URL (который может содержать путь или нет, например, http://google.com и http://www.google.com/abc/dfg) из аргумента командной строки, а затем разделить их на имя домена и путь, но результаты кажутся неверными, и без valgrind ошибки не отображаются, а valgrind показывает ошибки. Я просто не могу понять, как это исправить. Может кто-нибудь помочь? Большое спасибо!

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
    char* domain;
    char* path;

    sscanf(argv[1], "http://%[^/]/%[^\n]", domain, path);
    printf("domain: %s\n", domain);
    printf("path: %s\n", path);
}

1 Ответ

0 голосов
/ 04 апреля 2020

valgrind показывает ошибки

, и это трудно сделать, вы пропустили инициализацию домена и пути к действительному (достаточному) storage

Например, do

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
    char domain[32];
    char path[64];

    sscanf(argv[1], "http://%31[^/]/%63[^\n]", domain, path);
    printf("domain: %s\n", domain);
    printf("path: %s\n", path);
}

Примечание. Я ограничил длину чтения, чтобы не записывать из массивов (я удалил 1 в размере, чтобы иметь место для нулевого символа)

Но я также призываю вас проверить argv и значение, возвращаемое sscanf , чтобы узнать, сколько элементов вы прочитали, и вернуть значение:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {
    char domain[32];
    char path[64];

    if (argc < 2) {
      fprintf(stderr, "Usage: %s <URL>\n", *argv);
      return -1;
    }

    switch (sscanf(argv[1], "http://%31[^/]/%63[^\n]", domain, path)) {
    case 2:
      printf("path: %s\n", path);
      /* no break */
    case 1:
      printf("domain: %s\n", domain);
      break;
    default:
      fputs("this is not a valid url\n", stderr);
    }

    return 0;
}

конечно, вы также можете инициализировать домен [0] и путь [0] до 0.

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -Wall a.c
pi@raspberrypi:/tmp $ ./a.out
Usage: ./a.out <URL>
pi@raspberrypi:/tmp $ ./a.out aze
this is not a valid url
pi@raspberrypi:/tmp $ ./a.out http://google.com
domain: google.com
pi@raspberrypi:/tmp $ ./a.out http://google.com/abc/dfg
path: abc/dfg
domain: google.com
pi@raspberrypi:/tmp $ ./a.out http://google.com/a_too_long_path_to_be_memorized_in_only_64_characters_so_it_is_cut
path: a_too_long_path_to_be_memorized_in_only_64_characters_so_it_is_
domain: google.com
pi@raspberrypi:/tmp $ 

Обратите внимание, что защищенный URL ( https ) считается недействительным

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