我以前使用以下代码来确定文件是.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字节。我应该怎么做呢?
由于
答案 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