【发布时间】:2017-11-22 08:22:20
【问题描述】:
我有一个文件名“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;
}
【问题讨论】:
-
strncpy(mystring, TTF_Font_name, alen-4);: 那不是 nul-terminate 对吧? -
@EdHeal 确保没有使用 C++ 编译器 :)
-
The
strncpyfunction 在一种情况下可能不会终止字符串。这会发生在你身上。 -
然后
strcat去 WTF? 所以在你第一次打电话给strncpy之后添加mystring[alen-4] = 0;在strcat之前(你会想要确保mystring在strncpy(PFB_File, mystring, alen);之后再次nul-terminated -
你忘记了字符串的空终止
标签: c