获取文件名扩展名C错误

时间:2014-01-19 22:02:10

标签: c string

我正在使用以下函数来获取C中文件的扩展名。

int getExt(char *file_name, char *ext) {
    char *p = strrchr(file_name, '.');
    if(p == NULL) {
        return 0;
    }
    strcpy(ext, p);
    return 1;
}

我这样称呼它:

char file_in[40] = "santa.bmp", file_out[40] = "santa.pgn";
char file_in_ext[4], file_out_ext[4];

getExt(file_in, file_in_ext);
getExt(file_out, file_out_ext);

printf("file_in_ext: %s\nfile_out_ext: %s\n", file_in_ext, file_out_ext);

我得到以下输出:

file_in_ext: .bmp
file_out_ext: xn.bmp

从那时起,这显然毁了我的整个节目。然而,这只发生在大学测试员身上。

是的,你猜对了,这是一个功课。不过,我的问题不会解决我的作业。也许这只是家庭作业的0.0001%。因此,我认为我的问题是恰当的。

无论如何,更奇怪的是,在我的个人电脑,x64架构和Debian 7上,一切正常。我得到了正确的输出:

file_in_ext: .bmp
file_out_ext: .pgm

我对大学测试员的了解并不多,只是它是Debian 7。

你知道为什么会这样吗?有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

由于缓冲区溢出,您的程序遭受未定义的行为。您只为扩展分配了4个字符,但getExt()函数写了五个:".bmp"为四个,第五个是终止NULL字符。

您应该向getExt()函数传递另一个参数,给出ext缓冲区的大小。然后使用strncpy()代替strcpy()并传入该大小参数。这将防止缓冲区溢出。然后,您需要为扩展缓冲区分配更多空间。