尝试在C中获取文件扩展名时出现分段错误错误

时间:2016-12-01 08:29:34

标签: c fedora

我正在尝试用C编写一个函数,输入一个文件,如果文件扩展名为png,jpg等,则返回1.

这就是我写的:

int estImage(struct dirent *fichier)
{
    char nomFichier[256];
    strncpy (nomFichier, fichier->d_name, 255);

    char *dot = strrchr(nomFichier, '.');

    char * listeExtensionImage[] = {".png", ".jpg", ".jpeg", ".bmp" };
    int len = sizeof(listeExtensionImage)/sizeof(listeExtensionImage[0]);

    printf(dot); //Just to test

    for (int i=0; i<len; i++)
    {
        if(!strcmp(listeExtensionImage[i], dot))
            return 1;
        else
            return 0;
    }
}

如果我输入的文件不是图片(例如.c文件),那么它将返回0没有问题,printf(点)将显示“.c”。

但是,如果我尝试输入图片文件(.jpg或我列出的任何其他文件),我会收到消息分段错误(核心转储)。 然后,我意识到问题来自这条线:

if(!strcmp(listeExtensionImage[i], dot))

如果我删除for指令,以及中间的所有内容,那么我就不再有错误了。

但是我不明白为什么我有这个问题,因为我在同一个程序中有类似的测试,并且它有效:

int estExecutable(struct dirent *fichier) 
{
   char nomFichier[256]; // Variable qui contiendra le nom du fichier
   strncpy (nomFichier, fichier->d_name, 255); 
   const char *dot = strrchr(nomFichier, '.'); 
   if(strcmp(dot,".exe")==0)
   {
       printf(nomFichier);
       return 1;
   }
   else
       return 0;
}       

这个功能确实有效,我看不出我的两个功能有什么区别。有谁可以帮助我吗?谢谢!

编辑:也试过这个版本,但得到了同样的错误:

int estImage(struct dirent *fichier)
{

    char nomFichier[256]; // Variable qui contiendra le nom du fichier
    strncpy (nomFichier, fichier->d_name, 255);
    char *dot = strrchr(nomFichier, '.');

    int retour=0;

    if( (!strcmp(dot,".jpg")) || (!strcmp(dot,".png")) || (!strcmp(dot,".jpeg")) || (!strcmp(dot,".bmp")) ) 
        retour = 1;

    return retour;
}

2 个答案:

答案 0 :(得分:1)

你想要这个:

int estImage(struct dirent *fichier)
{
    char nomFichier[256];
    strncpy (nomFichier, fichier->d_name, 255);

    char *dot = strrchr(nomFichier, '.');

    if (dot == NULL)
       return 0;  // no extension => it's not an image

    char * listeExtensionImage[] = {".png", ".jpg", ".jpeg", ".bmp" };
    int len = sizeof(listeExtensionImage)/sizeof(listeExtensionImage[0]);

    printf(dot); //Just to test

    for (int i=0; i<len; i++)
    {
        if (strcmp(listeExtensionImage[i], dot) == 0)
            return 1;   // image extension found
    }

    return 0;   // no image extension found
}

答案 1 :(得分:0)

所以,多亏了玛丽安,我们发现了错误。函数estImage()在for循环中调用,它应该列出目录中的所有文件。该循环可能捕获了一个不可见的文件,或者具有空名称的东西,并且点变量为NULL。所以,工作代码是:

int estImage(struct dirent *fichier)
{

    char nomFichier[256]; // Variable qui contiendra le nom du fichier
    strncpy (nomFichier, fichier->d_name, 255);

    char *dot = strrchr(nomFichier, '.');

    int retour=0;


    if( dot!=NULL && ((!strcmp(dot,".jpg")) || (!strcmp(dot,".png")) || (!strcmp(dot,".jpeg")) || (!strcmp(dot,".bmp"))) ) //Si le fichier est une image
        retour = 1; // On retourne 1

    return retour;


}

非常感谢帮助我的每个人!