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;
}
}
}
//结束拆分
//现在我每次循环显示的链表内容及长度都是最后存入的内容和长度,我很疑惑? 为什么?
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;
}
}
}
//结束拆分
//现在我每次循环显示的链表内容及长度都是最后存入的内容和长度,我很疑惑? 为什么?
如果你说的是你while(posl != NULL)之后部分是你的显示循环的话
有个疑问就是 posl 在循环中并没有依次赋值,一直是一个位置吧,所以数据就是一个?
m_lContent.AddTail(pContentData);
设置断点,观察m_lContent的内容是否正确。
POSITION pos1=tContent.GetHeadPosition();
而且
ContentL* pSmsData=(ContentL*)tContent.GetNext(pos1);
中GetNext的参数是引用类型 POSITION &,每次pos1会递增的。
we need nothing in this world but logic...
面item全部Add到另一个List对象中,如果不是这么做的,那么:
//CContentList& tContent=m_lContent;
建议在while中直接使用m_lContent,而不是tContent。
{
//开始拆分
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?
{
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]);
}