在C语言中获取文件扩展名

41

如何在C语言中从文件名获取文件扩展名(例如.tiff)?

谢谢!


可能是在C语言中获取文件扩展名的重复问题。 - nibot
4个回答

79
const char *get_filename_ext(const char *filename) {
    const char *dot = strrchr(filename, '.');
    if(!dot || dot == filename) return "";
    return dot + 1;
}

printf("%s\n", get_filename_ext("test.tiff"));
printf("%s\n", get_filename_ext("test.blah.tiff"));
printf("%s\n", get_filename_ext("test."));
printf("%s\n", get_filename_ext("test"));
printf("%s\n", get_filename_ext("..."));

dot = strrchr(filename, '.');之后,dot != NULL意味着*dot == '.',因此您的测试应该简单地为if(dot) - Chris Lutz
我遇到了一个错误:renamer.c:11: warning: incompatible implicit declaration of built-in function ‘strrchr’ - errorhandler
12
对于大多数实际目的而言,如果最后一个点是基本名称的第一个字符,则不应将其视为文件扩展名。例如,在 ~/.forward 中,“.forward” 不是扩展名。 - Steve Jessop
这并不重要...因为我只是用它来批量重命名我的照片。 - errorhandler
一旦您提取了文件扩展名,一个有用的补充可能是来自string.hstrcmp()例程。它将允许您将文件扩展名与给定字符串进行比较并执行某些操作,例如 if (strcmp(ext,"tiff") == 0) ... - mabalenk

26

strrchr 找到最后一个点号,然后向前移动一个字符

#include <stdio.h> /* printf */
#include <string.h> /* strrchr */

ext = strrchr(filename, '.');
if (!ext) {
    /* no extension */
} else {
    printf("extension is %s\n", ext + 1);
}

不需要复制它 - 您将返回一个以原始字符串结尾的字符串部分,因此不需要进行修改。 - ThiefMaster
如果他不复制它并尝试释放扩展名,那么会抛出一个错误。如果他释放了文件名,那么扩展名也会被一起释放,但总的来说,这可能会导致问题。Malloc不关心你分配的指针,它在内存中有一个单独的位置来跟踪分配的内容和分配的大小。即使你分配了200个字节并使用了其中的10个,malloc仍然会释放200个字节。我不确定是否有什么我忽略了的东西,使得strdup(ext+1)成为一个较差的选择,如果有的话,请进一步评论。 - undefined

7
您可以使用strrchr函数来查找字符串中最后一个字符的位置,进而找到最后一个点号。然后,您可以将剩余的字符串读取为扩展名。

4

这里有一个版本,它也适用于文件(或目录)路径

#include <assert.h>
#include <string.h>

const char *FileSuffix(const char path[])
{
    const char *result;
    int i, n;

    assert(path != NULL);
    n = strlen(path);
    i = n - 1;
    while ((i > 0) && (path[i] != '.') && (path[i] != '/') && (path[i] != '\\')) {
        i--;
    }
    if ((i > 0) && (i < n - 1) && (path[i] == '.') && (path[i - 1] != '/') && (path[i - 1] != '\\')) {
        result = path + i;
    } else {
        result = path + n;
    }
    return result;
}


int main(void)
{
    assert(strcmp(FileSuffix(""), "") == 0);
    assert(strcmp(FileSuffix("."), "") == 0);
    assert(strcmp(FileSuffix("f"), "") == 0);
    assert(strcmp(FileSuffix("foo"), "") == 0);     
    assert(strcmp(FileSuffix("foo."), "") == 0);    
    assert(strcmp(FileSuffix(".foo"), "") == 0);
    assert(strcmp(FileSuffix("foo.bar"), ".bar") == 0); 
    assert(strcmp(FileSuffix("foo/.bar"), "") == 0);
    assert(strcmp(FileSuffix("foo\\.bar"), "") == 0);   
    assert(strcmp(FileSuffix("foo/bar.baz.qux"), ".qux") == 0);
    assert(strcmp(FileSuffix("foo\\bar.baz.qux"), ".qux") == 0);
    assert(strcmp(FileSuffix("foo.bar.baz/qux"), "") == 0);
    assert(strcmp(FileSuffix("foo.bar.baz\\qux"), "") == 0);    
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接