我有一个看起来像这样的字符串:
HTTPS DOWNLOAD_FILE /ab/cd/e/f/kk.png\r\n\r\n
这里\r\n\r\n
表示请求结束标记。我需要提取文件路径 /ab/cd/e/f/kk.png
。我怎样才能做到这一点?
我尝试按空格分隔字符串(使用函数 strtok
),然后向下循环以获取第三个标记,但是有更好的方法吗?
最佳答案
继续我的评论,要解析字符串的路径,您的字符串必须是可变的而不是字符串文字,那么只需找到第一个'/'
标记路径的开头,然后使用 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"
)。因此返回的是路径中第一个 '/'
和 "...png"
中最后一个 'g'
之间的字符数> (即您想要的路径的字符串长度)。然后,当您执行 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 终止字符串,您只需将该字符设置为 nul 字符 '\0'
,它在数字上相当于 0
。请参阅ASCII Table & Description .
示例使用/输出
$ ./bin/pathfromstr
path: /ab/cd/e/f/kk.png
关于c - 从字符串中提取文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59807413/