我有一个文件名“test.mf”作为字符指针。我想将此文件的扩展名更改为“test.pfb”。我正在为此编写一个简单的代码,但它导致打印一些垃圾字符。在联机C编译器上运行相同的代码不会导致垃圾值,但使用GCC运行它会导致垃圾值。 如果我能以更好,更快的方式实现相同的目标(将.mf文件的文件扩展名更改为.pfb),请建议。我是新手,所以请忽略愚蠢的错误。
代码
char *Get_PFB_font_file_name(char *TTF_Font_name)
{
size_t alen = strlen(TTF_Font_name);
alen = alen+1;
char mystring[alen];
const char* extension = ".pfb";
char *PFB_File= malloc(alen+1);
strncpy(mystring, TTF_Font_name, alen-4);
strcat( mystring, extension );
strncpy(PFB_File, mystring, alen);
if(!PFB_File)
{
printf("error in get TTX conversion function");
exit(1);
}
return PFB_File;
}
int main ( void )
{
char *MF_Font_file_name = "test.mf";
char *PFB_Font_file_name;
PFB_Font_file_name = Get_PFB_font_file_name(MF_Font_file_name);
printf("PFB font file name is %s \n", PFB_Font_file_name); // garbage value here (test�.p)
return 0;
}
答案 0 :(得分:4)
关于strncpy
:
strncpy()函数类似于(strcpy),除了复制src的最多n个字节。警告:如果src的前n个字节中没有空字节,则dest中的字符串将不会以空值终止。
strncpy(mystring, TTF_Font_name, alen-4);
strcat( mystring, extension );
这具有未定义的行为,因为TTF_Font_name
超过alen-4
因此上述警告/限制适用,strcat
无法正确计算mystring
的大小。
解决这个问题的一种方法:只需在两行之间插入:
mystring[alen-4] = '\0';