用于在C中通过文件名识别图形/文件或存档文件的功能

时间:2017-09-11 12:48:00

标签: c

我想使用以下代码检查文件是图形,图像还是存档文件:

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;
}   

但我无法得到理想的结果。有人可以帮我这个吗?

1 个答案:

答案 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)==0true,而strcmp("art","a")==0则不是因为它也考虑了两个字符串的长度,因为你知道extension指向文件扩展名,它应该是完全匹配。