一个关于字符串的分割和排序 CString str="是|1;我|0;人|2";每个字用;来分割用|后的数字来排序,这个问题该怎么办??排序后输出:我是人这个问题好像有点难哦看看有人会不? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 提供思路,用find打到0,再向前移两个元素,可以得到我,同理可以得到其它,用一个for循环即可. http://wenku.baidu.com/view/6070edd126fff705cc170a57.html 楼主看看这个,CString的成员函数,应该比较好解决 直接写一循环find(";"),然后再find("|")就可以解析出来了. #define MAX_BUFFER 30 CString strText=_T("是|1;我|0;人|2"); CString strBuf[MAX_BUFFER] = {_T("")}; CString strTmp(_T("")); int curPos = 0; LPCTSTR szToken = _T(";"); LPCTSTR szGap = _T("|"); int nCount = 0; while(_T("") != (strTmp = strText.Tokenize(szToken, curPos))) { int flag = strTmp.Find(szGap); if(-1 != flag) { strBuf[_ttoi(strTmp.Mid(flag+1))] = strTmp.Left(flag); } } CString strInfo(_T("")); for(int i=0; i<sizeof(strBuf)/sizeof(strBuf[0]); i++) { if(!strBuf[i].IsEmpty()) { strInfo += strBuf[i]; } } AfxMessageBox(strInfo); CString str=_T("是|1;我|0;人|2"); CString tmp; CString str1=_T(""); int k; for(k=0;k<3;k++) { int n=str.Find('k'); tmp=str.Mid(n-2,1); str1+=tmp; } MessageBox(str1);能看看,我这个程序错在哪儿吗,我觉得没错啊,可是结果不对 CString str=_T("是|1;我|0;人|2"); CString tmp; CString str1=_T(""); int k; for(k=0;k<3;k++) { int n=str.Find('k'); tmp=str.Mid(n-2,1); str1+=tmp; } MessageBox(str1);能给我看看错在哪儿吗 int n=str.Find('k'); CString str=_T("是|1;我|0;人|2");CString strbuf[3] = {""}; CString tmp; CString str1=_T(""); int k; for(k=0;k<3;k++) { int n=str.Find(';'); str1 = str.mid(n+1); tmp=str.left(n); n = temp.find('|'); strbuf[atoi(temp.mid(n+1))] = temp.left(n); str = str1; } MessageBox(strbuf[0]+strbuf[1]+strbuf[2]); 给楼主推荐个函数:strtok() 以“;”和“|”为标志将其分割存储,比如 是 后边解析的单词是 0 定义结构体 struct DATA{char str[10]; int index};OK 然后将解析的值存储,作为链表存储,建议是有STL种的list比较方便,然后再根据index排序输出即可呵呵 貌似比较啰嗦 见谅 CString str=_T("是|1;我|0;人|2"); CString tmp; CString str1=_T(""); int k; CString str2=L""; for(k=0;k<3;k++) { str2.Format(L"%d",k); int n=str.Find(str2); tmp=str.Mid(n-2,1); str1+=tmp; } MessageBox(str1);已验证通过 int n=str.Find('k');这种语句都能写出来,lz你还是补补基础知识吧,先弄清楚int,char都是怎么回事。 看了这么多大侠的回答,很是有些感慨。大家都在讨论这个被分割的字符串如何快速有效地解析,可是就是没有人提出切实可行的排序方法。不知道各位的数据结构学习得如何?会不会使用链表?我提出一个思路,给楼主参考一下:(1)创建结构体:typedef struct _ti{TCHAR t;//字符int i;//索引}ti;(2)创建链表:CList<ti,ti> lst;(3)逐个解析原来的字符串,将每个组的字符和索引ti st(如:我|0, 存储为:st.t='我',st.i=0), 然后将st存入lst:lst.AddTail(st)(4)创建字符串:CString strData;(5)遍历链表, 每次将链表中索引值最小的元素st提取出来,执行:strData+=st.t;再将st从链表中删除,然后从链表头部开始再次搜索最小索引元素st,将st.t追加到strData尾部...如此不停地循环,直到lst为空:CString strData;//要输出的排序后的字符串ti st;for(int i=0;i++;){if(lst.IsEmpty()) break;POSITION pos=lst.GetHeadPosition();while(pos){st=lst.GetAt(pos);if(st.i==i){strData+=st.t;lst.RemoveAt(pos);break;}lst.GetNext(pos);}} 一直用VC6.0,第一次用VS2008,简单的程序都搞不定,郁闷!大家救救我! 请问高手如何才能修改d3d9.dll的Direct3DCreate9接口 画图中的颜色填充功能是怎么实现的? office2003安装和卸载问题 用MFC实现UDP广播,并接收广播数据 请全体csdn朋友看过来,世间最不公平的现象!!表示强烈抗议!! 连接SQL出错?没道理啊 有关WindowsAPI函数PostMessage()的用法 请问:如何根据不同的视图显示不同的工具栏?? 关于立体校正后图像问题 对话框关闭问题 被公司搞的太伤了
#define MAX_BUFFER 30
CString strText=_T("是|1;我|0;人|2");
CString strBuf[MAX_BUFFER] = {_T("")};
CString strTmp(_T(""));
int curPos = 0;
LPCTSTR szToken = _T(";");
LPCTSTR szGap = _T("|");
int nCount = 0;
while(_T("") != (strTmp = strText.Tokenize(szToken, curPos)))
{
int flag = strTmp.Find(szGap);
if(-1 != flag)
{
strBuf[_ttoi(strTmp.Mid(flag+1))] = strTmp.Left(flag);
}
} CString strInfo(_T(""));
for(int i=0; i<sizeof(strBuf)/sizeof(strBuf[0]); i++)
{
if(!strBuf[i].IsEmpty())
{
strInfo += strBuf[i];
}
}
AfxMessageBox(strInfo);
CString str=_T("是|1;我|0;人|2");
CString tmp;
CString str1=_T("");
int k;
for(k=0;k<3;k++)
{
int n=str.Find('k');
tmp=str.Mid(n-2,1);
str1+=tmp;
}
MessageBox(str1);能看看,我这个程序错在哪儿吗,我觉得没错啊,可是结果不对
CString tmp;
CString str1=_T("");
int k;
for(k=0;k<3;k++)
{
int n=str.Find('k');
tmp=str.Mid(n-2,1);
str1+=tmp;
}
MessageBox(str1);能给我看看错在哪儿吗
CString str=_T("是|1;我|0;人|2");
CString strbuf[3] = {""};
CString tmp;
CString str1=_T("");
int k;
for(k=0;k<3;k++)
{
int n=str.Find(';');
str1 = str.mid(n+1);
tmp=str.left(n);
n = temp.find('|');
strbuf[atoi(temp.mid(n+1))] = temp.left(n);
str = str1;
}
MessageBox(strbuf[0]+strbuf[1]+strbuf[2]);
呵呵 貌似比较啰嗦 见谅
CString tmp;
CString str1=_T("");
int k;
CString str2=L"";
for(k=0;k<3;k++)
{
str2.Format(L"%d",k);
int n=str.Find(str2);
tmp=str.Mid(n-2,1);
str1+=tmp;
}
MessageBox(str1);
已验证通过
int n=str.Find('k');
这种语句都能写出来,lz你还是补补基础知识吧,先弄清楚int,char都是怎么回事。
我提出一个思路,给楼主参考一下:
(1)创建结构体:
typedef struct _ti
{
TCHAR t;//字符
int i;//索引
}ti;
(2)创建链表:
CList<ti,ti> lst;
(3)逐个解析原来的字符串,将每个组的字符和索引ti st(如:我|0, 存储为:st.t='我',st.i=0), 然后将st存入lst:lst.AddTail(st)
(4)创建字符串:
CString strData;
(5)遍历链表, 每次将链表中索引值最小的元素st提取出来,执行:
strData+=st.t;
再将st从链表中删除,然后从链表头部开始再次搜索最小索引元素st,将st.t追加到strData尾部...如此不停地循环,直到lst为空:CString strData;//要输出的排序后的字符串
ti st;
for(int i=0;i++;)
{
if(lst.IsEmpty()) break;
POSITION pos=lst.GetHeadPosition();
while(pos)
{
st=lst.GetAt(pos);
if(st.i==i)
{
strData+=st.t;
lst.RemoveAt(pos);
break;
}
lst.GetNext(pos);
}
}