对于”yyyy-mm-dd”的字符串,从中分割出年份yyyy、月份mm、天数dd,可以用MFC的STL类库std::vector<CString>里的TrimLeft()进行操作。
函数如下:
void Split(const CString &text,const TCHAR* separator,
std::vector<CString> &result,bool bAddEmptyItem)
{
int prev=0,current=0; //找到的当前匹配和上一个匹配
CString strCopyText = text;
strCopyText.TrimLeft(TEXT(" "));
//第一次先查找目标字符串,有没有包含分割符
if (strCopyText.Find(separator,0)<0)
{
if (strCopyText.GetLength()>0)
{
result.push_back(strCopyText);
}
return;
}
//循环提取中间的字符
int length=strCopyText.GetLength();
bool bExit=false;
while(1)
{
current = strCopyText.Find(separator,prev);
if (current == -1)
{
current=length;
bExit=true;
}
//上一个分割符之后和这个分割符之前的字符,就是有效的字符串
CString item=strCopyText.Mid(prev,current-prev);
if (bAddEmptyItem||item.GetLength()>0)
{
result.push_back(item);
}
if (bExit)
{
break;
}
prev = current + _tcslen(separator);
}
}
详细步骤如下:
1. 在VC6.0下,新建一个基于MFC对话框的应用程序,命名为fenGe2,
2. 在CXXXDlg.h 即CFenGe2Dlg.h头文件里,声明一个public函数:
void Split(const CString &text,const TCHAR* separator,
std::vector<CString> &result,bool bAddEmptyItem/* =true */);
并引用相应的头文件:<iostream>、<vector>和命名空间using namespace std; 如图(1)所示:
3. 在对话框的面板上拖曳一个按钮,名称为”分割”,ID为IDC_BTNFenGe,双击该按钮,编写相应的消息响应函数OnBTNFenGe():
OnBTNFenGe()的代码如下:
void CFenGe2Dlg::OnBTNFenGe()
{
// TODO: Add your control notification handler code here
CString strTar[3]={"2011-5-9","2011-6-7","2012-4-8"};
std::vector<CString> myStr,reStr;
int i=0;
for (i=0;i<3;i++)
{
myStr.push_back(strTar[i]);
}
// AfxMessageBox("第一个字符串: "+myStr[0]+
// "\n第二个字符串: "+myStr[1]+
// "\n第三个字符串: "+myStr[2]
//
// );
Split(myStr[0],TEXT("-"),reStr,false);
//输出第一字符串里的年、月、日
AfxMessageBox("年份: "+reStr[0]+"\n月份: "+reStr[1]+"\n天数: "+reStr[2]);
}
4. 按F7–》Ctrl +F5,得到字符串”2011-5-9”分割的效果如下: