Извлечение пути к файлу из строки - PullRequest
0 голосов
/ 19 января 2020

У меня есть строка, которая выглядит следующим образом:

HTTPS DOWNLOAD_FILE /ab/cd/e/f/kk.png\r\n\r\n

Здесь \r\n\r\n обозначает маркер конца запроса. Мне нужно извлечь путь к файлу, который /ab/cd/e/f/kk.png. Как я мог это сделать?

Я пытался разбить строку на пробел (используя функцию strtok), а затем зацикливался, чтобы получить третий токен, но есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 19 января 2020

Продолжая мой комментарий, чтобы разобрать путь из вашей строки, ваша строка должна быть изменяемой, а не string-literal , тогда нужно просто найти первую '/', отмечающую начало вашего пути, а затем удаляя маркер запроса с помощью strcspn.

Например:

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

int main (void) {

    char str[] = "HTTPS DOWNLOAD_FILE /ab/cd/e/f/kk.png\r\n\r\n",
        *p = str;

    if ((p = strchr (p, '/'))) {        /* locate '/' in str, validate */
        p[strcspn (p, "\r\n")] = 0;     /* terminate at 1st CR */
        printf ("path: %s\n", p);       /* output resulting path */
    }
}

Функция strcspn возвращает количество символов в строка, начинающаяся с p, которая НЕ является символом в наборе reject "\r\n". (вы можете просто использовать "\r" там). Таким образом, возвращаемое значение - это число символов между первым '/' в вашем пути и последним 'g' в "...png" (то есть длина строки вашего требуемого пути). Когда вы затем делаете p[len] = 0;, вы обнуляете строку после len символов. Где вы используете strcspn (p, "\n\r"), чтобы получить len.

Подумайте об этом так, эквивалент будет:

    if ((p = strchr (p, '/'))) {            /* locate '/' in str, validate */
        size_t len = strcspn (p, "\r\n");   /* get length up to 1st CR */
        p[len] = 0;                         /* terminate at 1st CR */
        printf ("path: %s\n", p);           /* output resulting path */
    }

Мы просто объединили оба в одно выражение. Также обратите внимание, что для завершения строки в любой момент вы просто устанавливаете для этого символа значение nul '\0', которое численно эквивалентно 0. См. ASCII Таблица и описание .

Пример использования / Вывод

$ ./bin/pathfromstr
path: /ab/cd/e/f/kk.png
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...