【问题标题】:Getting file extension in C languageC语言获取文件扩展名
【发布时间】:2010-06-14 06:02:36
【问题描述】:

假设有一个名为 12345.jpg 的文件。在 C 中,如何获取文件扩展名以便与某些文件扩展名进行比较?如果有任何内置功能,请告诉我。

【问题讨论】:

标签: c


【解决方案1】:

执行此操作的函数以及测试工具:

#include <stdio.h>
#include <string.h>

const char *getExt (const char *fspec) {
    char *e = strrchr (fspec, '.');
    if (e == NULL)
        e = ""; // fast method, could also use &(fspec[strlen(fspec)]).
    return e;
}

int main (int argc, char *argv[]) {
    int i;
    for (i = 1; i < argc; i++) {
        printf ("[%s] - > [%s]\n", argv[i], getExt (argv[i]));
    }
    return 0;
}

运行这个:

./program abc abc. abc.1 .xyz abc.def abc.def.ghi

给你:

[abc] - > []
[abc.] - > [.]
[abc.1] - > [.1]
[.xyz] - > [.xyz]
[abc.def] - > [.def]
[abc.def.ghi] - > [.ghi]

【讨论】:

  • +1 表示strrchr。查找字符串中字符的最后一个实例的最佳方法。
  • 以防万一有人错过。 getExt() 假定 fspec 是基本名称,而不是完整路径。考虑例如my.dir/file。使用basename() 从完整路径中获取基本名称。
【解决方案2】:

大概:

#include <string.h>

char *extn = strrchr(filename, '.');

这将为您提供一个指向扩展周期的指针,如果没有扩展,则为您提供一个空指针。您可能需要做更多的尽职调查,以确保点后没有斜线等。

【讨论】:

  • strrchr(filename+1,'.'); 将处理像 .svn 这样以点开头但没有扩展名的名称。
  • @drawnonward - 毫无疑问,如果您认为这是一个没有扩展名的文件名,而不是没有名字的扩展名。这是另一个需要考虑的“尽职调查”案例。但是,如果 OP 想要将找到的扩展名与相当短的已知扩展名列表进行比较,那么 .svn 不在列表中的事实意味着它可能无论如何都无关紧要。
  • @drawnonward:我误解了你的意思——你的观点很有道理。但是,这对于以“/”开头的绝对路径名或包含斜杠 (subdir/.svn) 的相对名称没有帮助。有一种情况说您需要找到文件基本名称的开头(在最后一个斜杠之后,但您必须担心尾随斜杠和根),然后查找不在第一个位置的点。我猜这意味着父目录“..”的名称为“点”,后跟以点开头的扩展名,仅此而已......通常还有另一个曲线球要处理。
  • @drawnonward 如果文件名是空字符串,可能会导致分段错误。
【解决方案3】:

有一个便携式 CRT 解决方案:_splitpath

在 Windows 中还有一个未记录的 shell32 API,称为 PathGetExtension,但这在很多方面都是邪恶的,我可能不应该注意到这一点。

【讨论】:

  • 这显然是我以前不知道的“便携”这个词的一些新定义 :-) 向 HHGTTG 声名的道格拉斯亚当斯道歉。
  • 确实,从未在同一句话中看到过“便携”一词和指向 msdn 的链接:-)
  • 我的错,我的错!不会编辑答案,供其他人欣赏:)
  • 嗯,是的,答案仍然有用,所以我不会编辑它。如果您在 MS 平台上,最好使用 _splitpath 而不是自己编写(例如在我的回答中)。
  • 当然 - 我考虑过移除“便携式”(我的头在哪里,真的吗?)但放弃了。
【解决方案4】:

使用 strchr 第一个数组成员会给你文件名 第二个数组成员会给你扩展

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2012-06-07
    • 2016-09-01
    相关资源
    最近更新 更多