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