fprintf不打印Unicode字符[关闭]

Posted

技术标签:

【中文标题】fprintf不打印Unicode字符[关闭]【英文标题】:fprintf not printing Unicode character [closed] 【发布时间】:2013-05-24 13:28:30 【问题描述】:

今天早上我发现了一个非常奇怪的问题,我找不到解决方案。请帮我用下面的代码解决这个问题(使用 Visual Studio C++ 和 MFC):

FILE *fp = NULL;
//fp = fopen(mmFileName , "a");
//Store the module directory path
fopen_s( &fp , "TempWorking.xml" , "wb");
//char* TempChar;
CString strtempff;
strtempff = "\"<article>  <section class="page"><p>Writing for the clown show that is <em>Forbes</em>, Darcy Travlos asks the <a href="http://en.wikipedia.org/wiki/Betteridge%27s_law_of_headlines">Betteridge’s Law</a>-challenging question “Apple And Google: The New ‘Old’ Reality?†(No link but tip o’ the an";
char* TempArray;
TempArray = new char[strtempff.GetLength()];
strcpy(TempArray,strtempff.GetString());
strtempff = "";
strtempff.Empty();
fprintf(fp,(char*)TempArray);

我不知道为什么我的代码在fprintf() 语句中不起作用:它给了我一个调试断言。 strtempff收集自网络,只是代码中的一个例子。

【问题讨论】:

可能是怪怪的,没戴。 好吧好吧很奇怪,但它的问题 @R.MartinhoFernandes nop 它不适用于 TempArray[strtempff.GetLength()-1] = '\0'; 【参考方案1】:

我相信您的错误是您向 fprintf 提供了一个不是格式字符串的字符串。你应该这样做:

fprintf(fp,"%s",(char*)TempArray);

解释一下,你的字符串中的任何 % 字符都会混淆它,因为它们是 printf 系列函数的特殊格式字符。其他关于缓冲区长度不足的 cmets 也是正确的,您也需要修复它。

您可能还想使用fwprintf 和宽字符串,因为您正在尝试打印扩展字符集。 http://www.cplusplus.com/reference/cwchar/fwprintf/

【讨论】:

TempArray 已经是char*,不需要强制转换。 @RemyLebeau 也是如此。我只是简单地复制了他的代码,并进行了最少的必要更改。【参考方案2】:

CString::GetLength() 函数不包含 0 终止符,因此您声明的数组太小。

例如,如果CString 是“a”,那么GetLength() 将返回 1,并且您将分配 1 个字符的 TempArray,但随后 strcpy() 将写入 2 个字符,因为它 终止字符串,导致缓冲区溢出和未定义的行为。

【讨论】:

TempArray = new char[strtempff.GetLength()+2];也不行?? TempArray = new char[strtempff.GetLength()+10];也不行..

以上是关于fprintf不打印Unicode字符[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用两个fprintf语句写入C中的文件

fscanf和fprintf

C库 - 常用文件IO函数

在 Matlab 中打印非 ASCII / 符号字符

fopen,fprintf,fclose的单线程? [关闭]

什么函数能够将结构化数据写入excel文件中