typedef struct tagContent{
    char sContent[140+1];
    int  sLen;
}ContentL;
typedef CTypedPtrList<CPtrList,ContentL*> CContentList;
CContentList m_lContent;//增加超长短信拆分后内容存放队列
#define SMSLEN 140
int truncate_str(char *str,char** outStr);//拆分超长字符串,输出每个子字符串
//上面是我的链表定义内容及函数定义
if(nMsgLen>140)
        {
                  //开始拆分
int L=0;
L=nMsgLen/SMSLEN; //待拆分个数
    if(nMsgLen%SMSLEN!=0 || L==0)
                    L++;
                    if(!m_lContent.IsEmpty())
                    m_lContent.RemoveAll();
                    ContentL* pContentData=new ContentL;
            //定义拆分后字符串变量
                   char* outStr[20];
                 
                   char** pstr = NULL;
                    for(int i = 0; i < L; i ++)
                     {
                     outStr[i] = new char[SMSLEN+1];
                     }
                 truncate_str((char*)sMsgContent,outStr);//这是我的截分函数,输出char**的字符串,能正确输出,已经跟踪.
                     pstr = outStr;
                     for (i = 0; i < L; i++)
                     {
                     strcpy(pContentData->sContent,*pstr); //放进链表内容
               pContentData->sLen=strlen(*pstr);//放进链表内容长度                     m_lContent.AddTail(pContentData);
char sData[200];
                        sprintf(sData,"子符串是:%s",pContentData->sContent);
                        AfxMessageBox(sData);//这儿每次都是对的
                        sprintf(sData,"长度是:%d",pContentData->sLen);
                        AfxMessageBox(sData);//这儿每次都是对的
                     pstr++; 
                     if(outStr[i] != NULL) 
        delete [](outStr[i]);
                    }
                     
                     CContentList& tContent=m_lContent;
                     if (!tContent.IsEmpty())
                     {        
                      POSITION pos1=tContent.GetHeadPosition();
                      POSITION postmp1=pos1;
              
                       while(pos1!=NULL)
                       {
                        ContentL* pSmsData=(ContentL*)tContent.GetNext(pos1);
                        char sData[200];
                        sprintf(sData,"子符串是:%s",pSmsData->sContent);
                        AfxMessageBox(sData);//每次循环取链表内容为最后放入的字符串的内容
                        sprintf(sData,"长度是:%d",pSmsData->sLen);
                        AfxMessageBox(sData););//每次循环取链表长度为最后放入的字符串的内容                        postmp1=pos1;
                       }          
                     }    
                     
                }
                //结束拆分
//现在我每次循环显示的链表内容及长度都是最后存入的内容和长度,我很疑惑? 为什么?

解决方案 »

  1.   

    不是很熟悉CTypedPtrList
    如果你说的是你while(posl != NULL)之后部分是你的显示循环的话
    有个疑问就是 posl 在循环中并没有依次赋值,一直是一个位置吧,所以数据就是一个?
      

  2.   

    建议在该行
        m_lContent.AddTail(pContentData);
    设置断点,观察m_lContent的内容是否正确。
      

  3.   

    pos1是符了初值的:
    POSITION pos1=tContent.GetHeadPosition();
    而且
    ContentL* pSmsData=(ContentL*)tContent.GetNext(pos1);
    中GetNext的参数是引用类型 POSITION &,每次pos1会递增的。
      

  4.   

    you are just trapped in a logical chaoes,your source are not orgnaized in an objective way,so check it by setting some breakpoints.all that you need to improve is acute logical thought.
    we need nothing in this world but logic...
      

  5.   

    你重载CContentList类的'='运算符了吗?怎么重载的?正确应该是把里
    面item全部Add到另一个List对象中,如果不是这么做的,那么:
    //CContentList& tContent=m_lContent;
    建议在while中直接使用m_lContent,而不是tContent。
      

  6.   

    if(nMsgLen>140)
    {
                      //开始拆分
       int L=0;
       L=nMsgLen/SMSLEN; //待拆分个数
    if(nMsgLen%SMSLEN!=0 || L==0)
                        L++;
                        if(!m_lContent.IsEmpty())
                        m_lContent.RemoveAll();
                        ContentL* pContentData=new ContentL;
    //定义拆分后字符串变量

                   char* outStr[20];
                   char** pstr = NULL;
                        for(int i = 0; i < L; i ++)
     {
                         outStr[i] = new char[SMSLEN+1];
     }
                         truncate_str((char*)sMsgContent,outStr);
                     pstr = outStr;
                         for (i = 0; i < L; i++)
     {
                         strcpy(pContentData->sContent,*pstr); 
     pContentData->sLen=strlen(*pstr);
                         this->m_lContent.AddTail(pContentData);
     char sData[200];
      sprintf(sData,"%s",pContentData->sContent);
                         AfxMessageBox(sData);//这儿显示是对的
                         sprintf(sData,"%d",pContentData->sLen);//这儿显示也是对的
                         AfxMessageBox(sData);
                         pstr++; 
                         if(outStr[i] != NULL) 
     delete [](outStr[i]);
     }                    // CContentList& tContent=this->m_lContent;
                     if (!m_lContent.IsEmpty())
     {
              POSITION pos1=m_lContent.GetHeadPosition();
              POSITION postmp1=pos1;
      
              while(pos1!=NULL)
       {
            ContentL* pData=(ContentL*)m_lContent.GetNext(pos1);
            char sData[200];
            sprintf(sData,"%s",pData->sContent);
                            AfxMessageBox(sData);
                            sprintf(sData,"%d",pData->sLen);
                            AfxMessageBox(sData);

            postmp1=pos1;
       }   
     }
                         
    }
    //结束拆分
    按照最后一位兄弟说的,显示还是跟我原来的一样, why?
      

  7.   

    for (i = 0; i < L; i++)
    {
    strcpy(pContentData->sContent,*pstr); //放进链表内容
    pContentData->sLen=strlen(*pstr);//放进链表内容长度                     m_lContent.AddTail(pContentData);
    char sData[200];
    sprintf(sData,"子符串是:%s",pContentData->sContent);
    AfxMessageBox(sData);//这儿每次都是对的
    sprintf(sData,"长度是:%d",pContentData->sLen);
    AfxMessageBox(sData);//这儿每次都是对的
    pstr++; 
    if(outStr[i] != NULL) 
            delete [](outStr[i]);
    }
    你对pContentData赋值L次,你的m_lContent链表加了也L次一个的地址pContentData
    你只能得到最后一次赋值的字符串.正确的做法是:
    for (i = 0; i < L; i++)
    {
    ContentL* pNewContentData=new ContentL; strcpy(pNewContentData->sContent,*pstr); //放进链表内容
    pNewContentData->sLen=strlen(*pstr);//放进链表内容长度                     m_lContent.AddTail(pNewContentData);
    char sData[200];
    sprintf(sData,"子符串是:%s",pContentData->sContent);
    AfxMessageBox(sData);//这儿每次都是对的
    sprintf(sData,"长度是:%d",pContentData->sLen);
    AfxMessageBox(sData);//这儿每次都是对的
    pstr++; 
    if(outStr[i] != NULL) 
            delete [](outStr[i]);
    }