请教各位大大通常怎么查找跟分割CString字符串

没原来那个名字长了 2009-07-05 12:11:42
原型:
CString str,str1,str2,str3;
str="_1_张三_123456789";
LPTSTR p = str.GetBuffer(100);
for( int i = 0 ; i< abc ; i++)
{
str1+=p[i];
}

如果我想最后结果是 str2="张三" str3="123456789"
请问应该怎么处理
本人代码很差(初学)还请各位大大给点参考代码,,,,只有55分了全给了
...全文
1715 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
换成wscanf后可以编译但显示不了字符

MessageBox(str5); //放里正在显示 1_张三_123456789
int nLine;
wscanf((LPCTSTR)str5, "_%d_%s_%s", &nLine, str6.GetBuffer(str5.GetLength()), str7.GetBuffer(str5.GetLength()));
str6.ReleaseBuffer();
str7.ReleaseBuffer();
MessageBox(str6); //什么也没显示
MessageBox(str7); //什么也没显示
  • 打赏
  • 举报
回复
个楼的代码编译不过.....
1>.\3Dlg.cpp(235) : error C2664: “swscanf”: 不能将参数 2 从“const char [10]”转换为“const wchar_t *”
hdjfeng2009 2009-07-05
  • 打赏
  • 举报
回复
利用CStirng中的寻找字串成员函数可以解决吧...
skyxie 2009-07-05
  • 打赏
  • 举报
回复
CString str,str1,str2,str3;
str="_1_张三_123456789";
int nLine;
_stscanf((LPCTSTR)str, "_%d_%s_%s", &nLine, str2.GetBuffer(str.GetLength()), str3.GetBuffer(str.GetLength()));
str2.ReleaseBuffer();
str3.ReleaseBuffer();
fangchao918628 2009-07-05
  • 打赏
  • 举报
回复
fangchao918628 2009-07-05
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_5f93da790100deah.html
fangchao918628 2009-07-05
  • 打赏
  • 举报
回复

CString str1,str2,str3;
CString str="_1_张三_123456789";

AfxExtractSubString(str1,str,1,'_');
AfxExtractSubString(str2,str,2,'_');
AfxExtractSubString(str3,str,3,'_');


AfxMessageBox(str1);
AfxMessageBox(str2);
AfxMessageBox(str3);
supconsupcon 2009-07-05
  • 打赏
  • 举报
回复
都现成的函数调用啊,还不会用???
手把手教吧:
CString str;
str="_1_张三_123456789";
CStringArray strAry;
SplitCString(str,strAryRe,'_'); // 分割字符串
for ( int i = 0; i < strAry.GetSize(); i++ )
{
strAry.GetAt(i) // 数组strAry中每个成员都是分割后的字符串
// do somthing
}
百事烟 2009-07-05
  • 打赏
  • 举报
回复
	CString strSrc = _T("_1_张三_123456789");
CString str1 = strSrc.Mid(1,1);// 从序号1得长度1字串 结果 1 序号从0开始
int nIndex = strSrc.Find(_T("_"), 3);// 从序号3查找字串"_",也就是最后个"_"位置
CString str2 = strSrc.Mid(3, nIndex - 3);// 从序号3得长度(2个"_"之间的长度,第2个已知,第3个刚才已求出)字串 结果 1
int nCount = strSrc.GetLength();//总长度
CString str3 = strSrc.Mid(nIndex + 1, nCount - nIndex);
  • 打赏
  • 举报
回复
貌似已经按我的要求传给变量了
下面是我自己测试的代码各位大大看下有什么问题
str7=_T("1_张三123456789");
int a1,a2,a3,a4,a5;
a1=str7.GetLength();
LPTSTR p = str7.GetBuffer(100); //... 这个指针 p 发生了很多事情
for( int i = 0 ; i< a1 ; i++)
{
if(p[i]=='_')
{
a2=i+1;
}
}

for( a2 ; a2< a1 ; a2++)
{

if(p[a2]>126)
{
str6+=p[a2];
}
if(p[a2]>=48 && p[a2]<=57)
{
str5+=p[a2];
}
}

MessageBox(str6);
MessageBox(str5);
zhihuizhilv 2009-07-05
  • 打赏
  • 举报
回复
使用3个CString函数可以解决问题:
Find //找到分隔符的位置
Left //取指定位置的的左边
Mid //取字符串的一段(可以用来取分隔符右边的字符串)
  • 打赏
  • 举报
回复
这么长?可惜我代码能力太差不会用......
只能找其它更简单的方法....
supconsupcon 2009-07-05
  • 打赏
  • 举报
回复
给你两个字符串分割的函数
/****************************************************************************
*
* 函数指针: SplitCString
* 描 述: 将字符串按给定的符号进行拆分
* 创 建: 黄德才[2008-4-11 8:59:58]
*
* 返 回: [int] - 拆分后的子串个数
*
* 函数参数 :[in] strIn - 需要进行拆分的字符串
* [out] strAryRe- 拆分后的字符串数组
* [in] c - 分割符
****************************************************************************/
int CSysCfgApp::SplitCString(CString strIn, CStringArray& strAryRe, char division)
{
strAryRe.RemoveAll();
if (!strIn.IsEmpty())
{
int nCount = 0;
int nPos = -1;
nPos = strIn.Find(division);
CString strTemp = strIn;
while (nPos != -1)
{
CString strSubString = strTemp.Left(nPos);
strTemp = strTemp.Right(strTemp.GetLength() - nPos-1);
nPos = strTemp.Find(division);
nCount++;
strAryRe.Add(strSubString);
}

if (nCount == strAryRe.GetSize())
{
CString str;
int nSize = strIn.ReverseFind(division);
str = strIn.Right(strIn.GetLength()-nSize-1);
strAryRe.Add(str);
}
}

return strAryRe.GetSize();
}

/****************************************************************************
*
* 函数指针: SplitCString
* 描 述: 将字符串按给定的符号进行拆分
* 创 建: 黄德才[2008-4-11 9:30:58]
*
* 返 回: [int] - 拆分后的子串个数
*
* 函数参数 :[in] strIn - 需要进行拆分的字符串
* [out] strAryRe- 拆分后的字符串数组
* [in] str - 分割字符串
****************************************************************************/
int CSysCfgApp::SplitCString(CString &strIn, CStringArray& strAryRe, LPCTSTR str)
{
if (str == _T(""))
{
strAryRe.RemoveAll();
return 0;
}

int nStart = 0;
int nEnd = 0;
CString strTmp;
while ( (nEnd = strIn.Find(str, nStart)) != -1 )
{
strTmp = strIn.Mid(nStart, nEnd-nStart);
strAryRe.Add(strTmp);
nStart = nEnd+2;
}
strTmp = strIn.Mid(nStart, strIn.GetLength());
strAryRe.Add(strTmp);

return strAryRe.GetSize();
}
  • 打赏
  • 举报
回复
CString str5,str6,str7;

str5=_T("_1_张三_123456789"); //正常显示 _1_张三_123456789
MessageBox(str5);
int nLine;
_stscanf((LPCTSTR)str5, _T("_%d_%s_%s"), &nLine, str6.GetBuffer(str5.GetLength()), str7.GetBuffer(str5.GetLength()));
str6.ReleaseBuffer();
str7.ReleaseBuffer();
MessageBox(str6); //显示张三_123456789
MessageBox(str7); //显示空....
看来还要用结果还重复一个次....
再试试.....

  • 打赏
  • 举报
回复
MessageBox(str5);
int nLine;
_stscanf((LPCTSTR)str5, _T("_%d_%s_%s"), &nLine, str6.GetBuffer(str5.GetLength()), str7.GetBuffer(str5.GetLength()));
str6.ReleaseBuffer();
str7.ReleaseBuffer();
MessageBox(str6);
MessageBox(str7);
编译通过了杂还是老样子....显示空
  • 打赏
  • 举报
回复
对不起我错了...
str="_1_张三_123456789"; 这个是我发问的时候手写的
工程里的str其实是读取文件内容得到的....呵呵
skyxie 2009-07-05
  • 打赏
  • 举报
回复
你的string都是这ansi赋值的,
str="_1_张三_123456789";

怎么工程又是unicode编码的?
skyxie 2009-07-05
  • 打赏
  • 举报
回复
_stscanf((LPCTSTR)str, _T("_%d_%s_%s"), &nLine, str2.GetBuffer(str.GetLength()), str3.GetBuffer(str.GetLength()));

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧