64,648
社区成员
发帖
与我相关
我的任务
分享
void FindPwd(CString str ,std::vector<CString> &vec) // 将str中的密码字段内容保存在vec容器中
{
int pos3 = 0;
int pos1 = str.Find("=" ,pos3);
int pos2 = str.Find(";" ,pos1+1);
while (pos1 != -1)
{
CString szAttr = str.Mid(pos3 ,pos1 - pos3);
CString szValue = str.Mid(pos1+1 ,pos2-pos1-1);
szAttr.Trim();
szValue.Trim(); // szValue可以不去空格,因为密码前后可能会有空格吧
szAttr.MakeLower(); // 转换为小写
if (szAttr.GetAt(0) == '~')
{
szAttr.Right(szAttr.GetLength()-1);
}
if (szAttr == "password" || szAttr == "pwd")
{
vec.push_back(szValue);
}
printf("%s = %s\n" ,szAttr ,szValue); // 测试,打印出来看看
pos3 = pos2+1;
pos1 = str.Find("=" ,pos3);
pos2 = str.Find(";" ,pos1+1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
CString strExample = _T("server=localhost;database=db01; uid=sa;password=abc123;~server=localhost;database=db03; User ID=test;PWd=xyXZ987;");
std::vector<CString> vec;
FindPwd(strExample ,vec);
return 0;
}
if (pos2 == -1) // 没有找到分号,说明是最后一个参数,
{
pos2 = str.GetLength()-1;
}
[/quote]一着急又写错了,pos2 = str.GetLength(); // 不能减一[/quote]
你看看对于这样的字符串该怎么分割呢?
"Server=localhost;Database=DB501;User ID=sa;Password=c3Rhci4xM=~Server=localhost;Database=DB502;User ID=sa;Password=testpppp;~other..."
分割后第一个Password对应的应该是c3Rhci4xM=,第二个对应的是testpppp。 if (pos2 == -1) // 没有找到分号,说明是最后一个参数,
{
pos2 = str.GetLength()-1;
}
[/quote]一着急又写错了,pos2 = str.GetLength(); // 不能减一 if (pos2 == -1) // 没有找到分号,说明是最后一个参数,
{
pos2 = str.GetLength()-1;
}
谢谢你的那个函数啦,可以直接用,但是有点小问题,就是容易死循环,嘿嘿。
不复杂,有特征啊,比如每个参数都是分号分隔,还有等号之后的就是参数值,这些特征就差不多够了,将等号之前分号之后的参数名都转换为小写,然后和password或者pwd比较,就可以提取密码段了