编写记事本的换行问题。
刚才用了下面的代码, 为什么缺少红色的代码,不对,后面的代码又没有用它,百思不得其解.
switch(id)
{
case ID_MENUITEMOPEN:
{
if (GetOpenFileName(&ofn))
{
FILE *fp= fopen(szFile,"r");
fp=fopen(szFile,"r");
int flag=0;
char strT[200000];
char t[2];
wsprintf(t,"%i%i",'\r','\n');
char *str=(char*)malloc(sizeof(char)*80);
while(fgets(str,40,fp))
{
strcat(strT,str);
}
SetDlgItemText(hwnd,IDC_EDIT1,strT);
free(str);
}
}
break;
default:
break;
}
[解决办法]
本生这个代码就有问题,%i等同于%d,运行这个结果t中的内容变为"1310",加上字符串结束符,应该有5个字节,当这里指定义了2个字节。
char t[2];
wsprintf(t,"%i%i",'\r','\n');
看来比较合理的解释是,strT需要加上一个特殊的后缀1310才能工作,数组t定义在strT的后面,正好完成了这个需要。
char strT[200000];
char t[2];
另外,编译器不保证单个变量的地址是相邻的,这种写法是极其错误的,即使能工作,也不能说明这种写法是真确的,早晚会遇到程序崩溃的风险。
[解决办法]
strT需要做初始化,再strcat
strT[0] = '\0';
while(fgets(str,40,fp))
{
strcat(strT,str);
}
[解决办法]
t内存应该分配大点