把str的操作贴完,包括动态申请,赋值等操作,8成是越界了

解决方案 »

  1.   

    PS:
    数据结构为行链表,每个结点有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;
      

  2.   

    “行头结点也存数据,但linenum存的是全行的字符数,不是他结点的字符数 ”
    打错了 是charnum
      

  3.   


    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多分几个字节出来, 这样可以避免一些尾部多数据的问题。