【发布时间】:2010-06-14 06:02:36
【问题描述】:
假设有一个名为 12345.jpg 的文件。在 C 中,如何获取文件扩展名以便与某些文件扩展名进行比较?如果有任何内置功能,请告诉我。
【问题讨论】:
-
SO 290488 涵盖了很多相同的领域。
标签: c
假设有一个名为 12345.jpg 的文件。在 C 中,如何获取文件扩展名以便与某些文件扩展名进行比较?如果有任何内置功能,请告诉我。
【问题讨论】:
标签: 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。查找字符串中字符的最后一个实例的最佳方法。
getExt() 假定 fspec 是基本名称,而不是完整路径。考虑例如my.dir/file。使用basename() 从完整路径中获取基本名称。
大概:
#include <string.h>
char *extn = strrchr(filename, '.');
这将为您提供一个指向扩展周期的指针,如果没有扩展,则为您提供一个空指针。您可能需要做更多的尽职调查,以确保点后没有斜线等。
【讨论】:
strrchr(filename+1,'.'); 将处理像 .svn 这样以点开头但没有扩展名的名称。
.svn 不在列表中的事实意味着它可能无论如何都无关紧要。
subdir/.svn) 的相对名称没有帮助。有一种情况说您需要找到文件基本名称的开头(在最后一个斜杠之后,但您必须担心尾随斜杠和根),然后查找不在第一个位置的点。我猜这意味着父目录“..”的名称为“点”,后跟以点开头的扩展名,仅此而已......通常还有另一个曲线球要处理。
有一个便携式 CRT 解决方案:_splitpath。
在 Windows 中还有一个未记录的 shell32 API,称为 PathGetExtension,但这在很多方面都是邪恶的,我可能不应该注意到这一点。
【讨论】:
_splitpath 而不是自己编写(例如在我的回答中)。
使用 strchr 第一个数组成员会给你文件名 第二个数组成员会给你扩展
【讨论】: