【问题标题】:How to extract the leftover substring from strrchr() or strchr()?如何从 strrchr() 或 strchr() 中提取剩余的子字符串?
【发布时间】:2018-10-16 04:22:48
【问题描述】:

假设我有以下看起来像文件路径的字符串:

 char *filepath = "this/is/my/path/to/file.jpg";

我可以使用strrchr()提取file.jpg如下:

 char *filename =  strrchr(filepath, '/') + 1;

现在我需要提取并存储字符串this/is/my/path/to 的其余部分。我如何以最有效的方式做到这一点?请注意,我想避免使用strtok()regex或大的迭代循环。

如果:

我可以将相同的子字符串提取技术应用于strchr(),其中我使用strchr(filepath, '/') 提取了子字符串this,现在我需要提取其余的子字符串is/my/path/to/file.jpg

【问题讨论】:

  • 只需将第一个(文件名 - 文件路径)字符复制到新位置并附加一个 空字符'/' 分隔符需要一些额外的工作,如果找到的话。然而,这篇文章的细节太不清楚了。发布您尝试执行的操作。注意"this/is/my/path/to/file.jpg" 中的转义序列。
  • @chux:我想使用filenamefilepath 变量将其余的子字符串存储在directory_path 中,这样如果我执行printf("%s\n", directory_path),则输出为this/is/my/path/to .你能告诉我你如何编码“将第一个(文件名 - 文件路径)字符复制到新位置”吗?

标签: c string string.h strrchr


【解决方案1】:

将所有内容复制到文件名,然后附加'\0'

int   pathLen = filename - filepath;
char *path = (char *) malloc(pathLen + 1);
memcpy(path, filepath, pathLen);
path[pathLen] = '\0';

...

free(path);

【讨论】:

  • 要保持在保存状态,请使用 pathLen size_t 或更好的 ptrdiff_t
  • 在 C 中也不需要转换 malloc() 的结果。
  • @alk,演员是为了摆脱编译器警告。
  • 不,任何体面的 C 编译器都不应发出警告,在任何级别。如果是这样,要么是没有 C 编译器,要么是 30 年以前,要么是坏了。
  • 此外,任何以“消除编译器警告”为目的的演员都是危险的错误动机。
【解决方案2】:

如果您的字符串在可写内存中(即,不是字符串文字),您可以这样做

char *p =  strrchr(filepath, '/');
*p = '\0';
char *filename = p + 1;

这会给你指向“this/is/my/path/to”的文件路径和指向“file.jpg”的文件名。无需任何复制。

【讨论】:

  • 不仅“在可写内存中”,而且“可以根据程序的对象所有权和可变性合同进行写入”。
  • 根据 OP 的代码 filepath 指向字符串文字,其元素可能不会更改。所以这个*p = '\0'; 语句很可能会结束程序。
猜你喜欢
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 2018-06-24
  • 2016-05-08
  • 2013-03-21
  • 2015-07-06
相关资源
最近更新 更多