Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从字符串中提取文件路径_C_String - Fatal编程技术网

C 从字符串中提取文件路径

C 从字符串中提取文件路径,c,string,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删除请求标记 例如: #inclu

我有一个字符串,看起来像:

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 */
    }
}
我们只是把这两个组合成一个表达式。还要注意的是,要在任何时候以nul终止字符串,只需将该字符设置为nul字符
'\0'
,该字符在数字上等同于
0
。看

示例使用/输出

$ ./bin/pathfromstr
path: /ab/cd/e/f/kk.png

“有更好的办法吗?”。大概但是使用strtok是一种合理的方法。因此,除非您有更具体的问题,否则这个问题不适合堆栈溢出将返回指向第一个
'/'
的指针。然后只要
p[strcspn(p,“\r\n”)]=0
“png”
中的
'g'
之后nul终止。然后
p
将指向您的路径。(注意:字符串不能是字符串文字,如果它是先复制的话)@DavidC.Rankin当我尝试使用
printf(“%s”,p)
打印时,它给出了分段错误(核心转储),我在回答中添加了一个示例。如果您还有问题,请在下面留言。请您解释一下呼叫strcspn
的过程,并在同一次呼叫中分配
0
。我不清楚处的文档。我正在使用
recv
方法(从套接字)接收
str
。我在声明为
字符缓冲区[200]
的字符数组中接收它。这种方法还能用吗?因为您提到字符串必须是可变的。是的,
char buffer[200]
是一个包含200个字符的简单可变字符数组。现在,由于您是通过套接字接收输入的(很可能是使用低级的
读取
),因此每次读取都可能没有得到完整的字符串(您可能在一次迭代中根本没有得到任何字符串,然后在下一次迭代中得到的字符串就不止这些)。您如何读取套接字?我正在使用套接字可用的
recv
方法。它看起来像
recv(socket\u fd,headers,sizeof(headers)-1,0)此处
标题
声明为
字符标题[200]
headers
将包含字符串,即
HTTPS DOWNLOAD\u FILE/ab/cd/e/f/kk.png\r\n\r\n
我担心的是
headers
一开始并没有以nul结尾。尝试调用
bzero(头,200)
在调用
recv
之前立即执行,以确保
缓冲区归零。这样,您可以将
标题
视为字符串。如果
HTTPS下载文件/ab/cd/e/f/kk.png\r\n\r\n
末尾没有
'\0'
,这将解释您的错误。
$ ./bin/pathfromstr
path: /ab/cd/e/f/kk.png