把str的操作贴完,包括动态申请,赋值等操作,8成是越界了
解决方案 »
- 如何得到win7屏幕的放大比率?
- 为什么我的死跑不起来,在win7上的VS2005可以,我的WinXP的2008不行..
- 有个比较基础的问题想问下
- 急等解决(50分),关于继承的一个问题,代码贴出,望各位高手赐教!
- 怎么用程序得到U盘的序列号?(是硬件序列号,不是卷号,急,顶者有分,谁回答出来再另开贴给分)
- 如何能在处理完windows消息后,再把该消息放回windows的消息队列?
- 如何复制对话框
- 为什么在VC6.0中使用DAO却不能识别ACCESS的数据库文件格式(*.mdb)?
- 关于软件测试员的月薪
- 书上看到的套接字时序图是不是有错?谢谢
- 卖车票的线程同步问题
- 无边框对话框最小化还原一瞬间能看的见标题栏
数据结构为行链表,每个结点有80长 的字符数组
typedef struct Node
{
char data[NODESIZE];//存储该节点的字符
struct Node*next;//后继
struct Node*prior;//结点前驱//行头结点前驱
struct Node*pnextline;//用于头结点及行头结点的行指针
int charnum;//结点/头结点/行头结点存储的字符数
int line;//结点所在行/头结点所在行/行头结点所在行
int linenum;//结点在其行的序号/头结点所存行数/行头结点所存的结点数
}Node, *pNode;
GetCaretPosition返回对应的点在行中位置的序号以下代码是选中一行的,str存的是选中位置后所有的该行字符,用drawtext左对齐只打印选中的str = new char(p->charnum + 1);//GetCaretPosition缓存每行中的字符
pos = (start);//pos为光标在行中的位置
nnode = ceil(((double)pos) / 80);//pos所在结点
q = p;
for (j = 1; j <= nnode - 1; j++)//q移到pos所在结点
q = q->next;
i = pos - (nnode - 1) * 80; if (q == p && (p->linenum>1))//行头结点也存数据,但linenum存的是全行的字符数,不是他结点的字符数
for (j = 0; i <= 80; i++, j++)
str[j] = q->data[i];
else
for (j = 0; i <= q->charnum; i++, j++)
str[j] = q->data[i]; q = q->next;
while (q)
{
for (i = 1; i <= q->charnum; i++, j++)
str[j] = q->data[i]; q = q->next;
}
str[j] = '\0'; str = str;
dc.DrawText(str, rect, DT_LEFT);
dc.SetTextColor(clr);
dc.SetBkColor(clrbk);
//delete[]str;
打错了 是charnum
while (q)
{
for (i = 1; i <= q->charnum; i++, j++)
str[j] = q->data[i];q = q->next;
}
str[j] = '\0';
j = q->charnum + 1的时候, str[j] = '\0'会越界
PS: 建议把str多分几个字节出来, 这样可以避免一些尾部多数据的问题。