c - 从字符串中提取文件路径

标签 c string

我有一个看起来像这样的字符串:

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/

相关文章:

C存储分配器用法?

c - 保存字符串转换的数据结构

c - 如何在TI ccs6.0中创建自己的头文件

c++ - 比较 C++ 模板中的字符串文字

c++ - char数组前面的加号是什么意思?

python turtle : How to use the write function to join an integer and a string with the integer coming from a list

c++ - libcurl - 5 秒后出现奇怪的超时

c - C中有监视器吗?

c# - 在 C# 中使用 System.IO.File.ReadAllLines(fil) 跳过第一行

java - 字符串和字节数组中 BigInteger 值的差异