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