我正在尝试用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;
}
答案 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;
}
非常感谢帮助我的每个人!