如何从C中的字符串获取文件扩展名

新手上路,请多包涵

给定一个字符串 "filename.conf" ,我如何验证扩展部分?

我需要一个跨平台的解决方案。

原文由 JeffV 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 408
2 个回答

您必须确保处理多于一个点的文件名。例如: c:\.directoryname\file.name.with.too.many.dots.ext 不会被 strchrfind. 正确处理

我最喜欢的是具有扩展(路径)功能的 boost 文件系统库

原文由 Raz 发布,翻译遵循 CC BY-SA 2.5 许可协议

因此, 使用 std::filesystem 是最好的答案,但是如果由于某种原因您没有可用的 C++17 功能,即使输入字符串包含目录,这也将起作用:

 string getextn (const string &fn) {
  int sep = fn.find_last_of(".\\/");
  return (sep >= 0 && fn[sep] == '.') ? fn.substr(sep) : "";
}

我之所以添加这个,是因为如果文件的路径包含点而文件不包含,则此处的其余答案要么异常复杂,要么失败。我认为 find_last_of 可以查找多个字符这一事实经常被忽视。

它适用于 /\ 路径分隔符。如果扩展本身包含斜杠,它会失败,但这通常太罕见了。它不会对以点开头且不包含其他点的文件名进行任何过滤 - 如果这对您很重要,那么 是这里最不合理的答案。

示例输入/输出

 / => ''
./ => ''
./pathname/ => ''
./path.name/ => ''
pathname/ => ''
path.name/ => ''
c:\path.name\ => ''
/. => '.'
./. => '.'
./pathname/. => '.'
./path.name/. => '.'
pathname/. => '.'
path.name/. => '.'
c:\path.name\. => '.'
/.git_ignore => '.git_ignore'
./.git_ignore => '.git_ignore'
./pathname/.git_ignore => '.git_ignore'
./path.name/.git_ignore => '.git_ignore'
pathname/.git_ignore => '.git_ignore'
path.name/.git_ignore => '.git_ignore'
c:\path.name\.git_ignore => '.git_ignore'
/filename => ''
./filename => ''
./pathname/filename => ''
./path.name/filename => ''
pathname/filename => ''
path.name/filename => ''
c:\path.name\filename => ''
/filename. => '.'
./filename. => '.'
./pathname/filename. => '.'
./path.name/filename. => '.'
pathname/filename. => '.'
path.name/filename. => '.'
c:\path.name\filename. => '.'
/filename.tar => '.tar'
./filename.tar => '.tar'
./pathname/filename.tar => '.tar'
./path.name/filename.tar => '.tar'
pathname/filename.tar => '.tar'
path.name/filename.tar => '.tar'
c:\path.name\filename.tar => '.tar'
/filename.tar.gz => '.gz'
./filename.tar.gz => '.gz'
./pathname/filename.tar.gz => '.gz'
./path.name/filename.tar.gz => '.gz'
pathname/filename.tar.gz => '.gz'
path.name/filename.tar.gz => '.gz'
c:\path.name\filename.tar.gz => '.gz'

原文由 Jason C 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题