尝试在 C 中获取文件扩展名时出现分段错误
Segmentation fault error while trying to get file extension in C
我正在尝试用 C 编写一个函数,输入一个文件,如果文件扩展名是 png、jpg 等,returns 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 文件),那么它将 return 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;
}
所以,感谢 Marian,我们发现了错误。函数 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;
}
非常感谢所有帮助过我的人!
你想要这个:
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
}
我正在尝试用 C 编写一个函数,输入一个文件,如果文件扩展名是 png、jpg 等,returns 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 文件),那么它将 return 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;
}
所以,感谢 Marian,我们发现了错误。函数 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;
}
非常感谢所有帮助过我的人!
你想要这个:
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
}