我正在使用以下函数来获取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。
你知道为什么会这样吗?有办法解决这个问题吗?
答案 0 :(得分:3)
由于缓冲区溢出,您的程序遭受未定义的行为。您只为扩展分配了4个字符,但getExt()
函数写了五个:".bmp"
为四个,第五个是终止NULL字符。
您应该向getExt()
函数传递另一个参数,给出ext
缓冲区的大小。然后使用strncpy()
代替strcpy()
并传入该大小参数。这将防止缓冲区溢出。然后,您需要为扩展缓冲区分配更多空间。