1

今天早上我发现了一个非常奇怪的问题,我找不到解决方案。请帮我用下面的代码解决这个问题(使用 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是从网上收集的,只是代码中的一个例子。

4

2 回答 2

2

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

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

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

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

于 2013-05-24T13:42:33.687 回答
1

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

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

于 2013-05-24T13:34:20.363 回答