【发布时间】:2017-04-15 19:21:25
【问题描述】:
我正在尝试用 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(dot)将显示“.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;
}
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。