从C中的文件路径中解析文件扩展名

时间:2009-11-10 20:51:26

标签: c file string

我以前使用以下代码来确定文件是.exe或.o文件,从而将binFile设置为1:

if(strstr(fpath,".exe") != NULL || strstr(fpath,".o") != NULL)
          binFile = 1;

通过调试,我注意到这个方法也会使用foo.out或foo.execute等文件将binFile设置为1。我真正想要的是匹配'.exe \ 0'和'.o \ 0',但是strstr()说它忽略了终止的NUL字节。我应该怎么做呢?

由于

7 个答案:

答案 0 :(得分:6)

#include <stdio.h>
#include <string.h>

int endswith(const char* haystack, const char* needle)
{
    size_t hlen;
    size_t nlen;
    /* find the length of both arguments - 
    if needle is longer than haystack, haystack can't end with needle */
    hlen = strlen(haystack); 
    nlen = strlen(needle);
    if(nlen > hlen) return 0;

    /* see if the end of haystack equals needle */
    return (strcmp(&haystack[hlen-nlen], needle)) == 0;
}

int main(int argc, char** argv) {

    if(argc != 3) {
        printf("Usage: %s <string> <test-ending>\n", argv[0]);
        return 1;
    }

    printf("Does \"%s\" end with \"%s\"? ", argv[1], argv[2]);

    if(endswith(argv[1], argv[2])) {
        printf("Yes!\n");
    } else {
        printf("No!\n");
    }

    return 0;
}

答案 1 :(得分:4)

int iLen = strlen(fpath);
if  ((iLen >= 4 && strcmp(&fpath[iLen - 4], ".exe") == 0)
  || (iLen >= 2 && strcmp(&fpath[iLen - 2], ".o") == 0))
   binfile = 1;

编辑在长度上添加测试,以处理非常短的文件名。

答案 2 :(得分:4)

char *ext = strrchr(fpath, '.');

if (ext && (!strcmp(ext, ".exe") || !strcmp(ext, ".o")))
   binfile = 1;

如果您的系统有BSD / POSIX strcasecmp,您应该使用它而不是strcmp

答案 3 :(得分:2)

你可以检查一个strstr的结果(考虑搜索字符串的长度)以查看它是否为NULL。例如:

const char* p = strstr(fpath,".exe");

if (p != NULL && *(p + 4 + 1) == 0) // 4 is the length of ".exe"; +1 should get you to \0
    binFile = 1;

答案 4 :(得分:2)

我想获得扩展程序然后检查它。

char *suffix = strrchr(fpath,'.');

if (suffix)
{
  suffix++;
  if (!strcasecmp(suffix,"exe"))
  {
    // you got it
  }
}

增加后缀是可以的,因为你知道它指向那个时刻找到的一段时间。增加它将最终使它指向空终止字符,这根本不会打扰strcasecmp。

您也可以通过这种方式轻松查看扩展名列表。

答案 5 :(得分:0)

这样做的一种方式:

char * suffix = fpath;
char * i = fpath;
while (*i++) {
    if (*i == '.') {
        suffix = i;
    }
}

if (!strcmp(suffix, ".o") || !strcmp(suffix, ".exe")) {
    /* do stuff */
}

答案 6 :(得分:0)

您还可以使用属于CRT的_splitpath / _wsplitpath

http://msdn.microsoft.com/en-us/library/e737s6tf(v=vs.80).aspx