我想使用以下代码检查文件是图形,图像还是存档文件:
int check_ext(const char *name)
{
char *extension, *n;
n=strdup(name);
extension=strtok(n,".");
char i1[]="jpeg", i2[]="gif", i3[]="bmp", i4[]="tiff", i5[]="png", i6[]="jpg";
char a1[]="a", a2[]="ar", a3[]="sbx", a4[]="cpio", a5[]="tar", a6[]="shar", a7[]="LBR", a8[]="iso", a9[]="lbr", a10[]="mar";
if(strncmp(extension,i1,4)==0 || strncmp(extension,i2,3)==0
|| strncmp(extension,i3,3)==0 || strncmp(extension,i4,4)==0
|| strncmp(extension,i5,3)==0 || strncmp(extension,i6,3)==0)
{
return 1;
}
else if(strncmp(extension,a1,1)==0 || strncmp(extension,a2,2)==0
|| strncmp(extension,a3,3)==0 || strncmp(extension,a4,4)==0
|| strncmp(extension,a5,3)==0 || strncmp(extension,a6,4)==0
|| strncmp(extension,a7,3)==0 || strncmp(extension,a8,3)==0
|| strncmp(extension,a9,3)==0 || strncmp(extension,a10,3)==0)
{
return 2;
}
else
return 0;
}
但我无法得到理想的结果。有人可以帮我这个吗?
答案 0 :(得分:0)
如果您在调试器中检出代码,这是一个非常简单的问题,很容易识别出来。问题最终归结为这一行代码。
extension=strtok(n,".");
它正在做的是通过fullstops拆分文件名。它用'\0'
替换它找到的第一个fullstop并返回第一个“token”。因此,例如,如果您的文件名为“picture.jpg”,则此函数调用后的extension
将包含“picture”。不像你可能期待的那样“jpg”。在找到最后一个令牌之前,您需要继续致电strtok(NULL,".")
。
执行您尝试执行的操作的更简单方法是使用strrchr
。它会在字符串中找到最后一个字符,所以如果你有这个
extension=strrchr(n,'.');
它会指向“.jpg”。如果字符串中根本没有fullstop,它将返回NULL
。因此,您应该接下来检查,因为strncmp
如果获得NULL
则不会感到满意。如果它不是NULL
,你可以增加字符串,使其指向句点后面的字符。
if (extension==NULL)
{
return 0;
}
extension++;
也就是说,在这种情况下绝对没有理由使用strncmp
,事实上它会导致错误的分类。例如,如果extension
是“艺术” - strncmp("art","a",1)==0
是true
,而strcmp("art","a")==0
则不是因为它也考虑了两个字符串的长度,因为你知道extension
指向文件扩展名,它应该是完全匹配。