假设有一个名为12345.jpg的文件。在C语言中,我该如何获取文件扩展名以便与一些文件扩展名进行比较?如果有内置函数,请告诉我。
假设有一个名为12345.jpg的文件。在C语言中,我该如何获取文件扩展名以便与一些文件扩展名进行比较?如果有内置函数,请告诉我。
一个函数来实现这个功能,同时附带一个测试套件:
#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]
strrchr
,加一分。这是在字符串中查找最后一个字符的最佳方法。 - tomlogicgetExt()
假设fspec
是一个基本名称,而不是完整路径。例如,考虑my.dir/file
。使用basename()
从完整路径中获取基本名称。 - Michael Closson很可能是:
#include <string.h>
char *extn = strrchr(filename, '.');
这将为您提供延期的指针,如果没有延期,则提供空指针。您可能需要做更多的尽职调查,以确保在点号后面没有斜杠等其他内容。
strrchr(filename+1,'.');
可以处理以点开头但没有扩展名的名称,例如 .svn
。 - drawnonward.svn
不在列表中的事实可能并不重要。 - Jonathan Leffler有一个便携式CRT解决方案:_splitpath。
在Windows中还有一个未记录的shell32 API叫做PathGetExtension,但是它在很多方面都是邪恶的,所以我可能不应该提到它。
_splitpath
而不是编写自己的代码(例如在我的答案中)。 - paxdiablo