字符串截取問題


如有一個車牌:京A12345

用戶可能輸入:京A12***,京A123**,京A123*5,京A**345 進行模糊查詢,總之*的位置不固定。

如何對用戶輸入的模糊車牌進行解析。知道每個*的位置和個數?我好以此為依據對數據庫進行搜索。

結果能顯示*的位置和總個數

給出代碼,謝謝! 

22 个解决方案

#1


利用CString::Find()依次查找,找到字符串中所有的*字符,行不?

#2


Find是找到第一個,然后再截取,再找,直到找完為止?

#3


思路很清晰,就是不會寫代碼 郁悶

#4


循環Find()

#5


參考代碼有沒有?

#6


int Find(const CString& strText, int* pArray, int nCount)
{
if(strText.GetLength() && (NULL != pArray) && nCount)
{
memset(pArray, -1, sizeof(int) * nCount);

LPCTSTR lpszToken = _T("*");
int nStart = 0;
int nEnd = 0;
int nIndex = 0;
while(-1 != (nEnd = strText.Find(lpszToken, nStart)))
{
pArray[nIndex++] = nEnd;
nStart = nEnd + _tcslen(lpszToken);
}
return nIndex;
}
return 0;
}

// 調用
int a[10] = {0};

int nRet = Find(_T("京A12***"), a, 10);
CString strText;
CString strTmp;
for(int i=0; i != nRet; ++i)
{
strTmp.Format(_T("%d,"), a[i]);
strText += strTmp;
}
AfxMessageBox(strText);

#7


char[8]="京A123**";
int xn=0;
int wn[4]={0};
for(int x=2;x<8,x++){

  if(char[x]==42)
  {
    wn[xn]=1;
    xn++;    

   }
}

#8


 

CString strNumber = _T("京A*1*2*3");
int nPos = 0;
int nTotal = 0;
CString strDisplay = _T("");
while ((nPos=strNumber.Find('*', nPos)) != -1)
{
++nTotal;
//漢字兩個字節
strDisplay.Format("%d", nPos);
AfxMessageBox(strDisplay);
++nPos;
}

#9


樓上全部pass,SQL語句本來就有這樣的功能。 http://wenku.baidu.com/view/96268c49cf84b9d528ea7a45.html

#10


靈活的使用模糊查詢,可以使你的代碼簡單。

#11


如果你輸出A12***,則這樣查詢。

SELECT * FROM [tablename] WHERE u_chepai LIKE A12%

總之還是要根據你輸入,轉換成SQL的模糊查詢。這中間還需要設計一下

#12


數據庫沒學好啊。
SQL是很強大的。我也忘了。不怎么用到就容易忘~

#13


這個用正則表達式方便一些吧

#14


SELECT * FROM TABLENAME 
WHERE CARNO LIKE '%'+ PARTCARNO +'%'

#15


CString s = "京A1*1**";
s.ReplaceA('*', '?');

CString sql;
sql.Format("select * from tb where fd1 like '%s'", s);

#16


謝謝樓上各位

#17


你是查找數據庫?

#18


不是查找數據庫;
我是想兩個車牌模糊比對

如下:
如有一個車牌:京A12345

用戶可能輸入:京A12***,京A123**,京A123*5,京A**345 進行模糊比對,*的位置不固定。

我怎么判斷 京A12***,京A123**,京A123*5,京A**345等車牌,除了*之外的漢字或者數字都相同,且位置一樣。

目前我是這樣想的,如果車牌X為京A12345,要與Y車牌京A123*5進行對比,我首先把Y車牌京A123*5中的,*位置取出來,然后把X車牌京A12345中同位置的數字4替換成*,然后把替換后的X車牌京A123*5與Y車牌京A123*5比較,是相同的。

也就是車牌模糊比對,如果出了*之外的所有數字和漢字都相同,則記錄下來。X車牌京A12345

不知道我表述的是否清楚呢?


我用VS2010開發,先前開了一個類似的帖子,其中有人給出的代碼在2010下不能編譯,郁悶那!!!

#19


自己寫了一個很笨的方法,請指點:看有什么bug嗎?偶爾會報個錯,運行異常。
京A12***,京A123**,京A123*5,京A**345隨便輸入,最后得出替換掉對應位置的車牌號,然后再跟模糊的進行比較。

CString CXXXXtDlg::AnalyseStr(CString alarmHphm,CString Hphm) 
{
CString str,strPostion;
int postion1,postion2,postion3,postion4,postion5;
int count=alarmHphm.Replace(L"*",L"*");
if(count>0)
{
switch(count)
{
case 1:
postion1=alarmHphm.Find(L"*");
Hphm.SetAt(postion1,'*');
break;
case 2:
postion1=alarmHphm.Find(L"*");
Hphm.SetAt(postion1,'*');
postion2=alarmHphm.Find(L"*",postion1+1);
Hphm.SetAt(postion2,'*');
break;
case 3:
postion1=alarmHphm.Find(L"*");
Hphm.SetAt(postion1,'*');
postion2=alarmHphm.Find(L"*",postion1+1);
Hphm.SetAt(postion2,'*');
postion3=alarmHphm.Find(L"*",postion2+1);
Hphm.SetAt(postion3,'*');
break;
case 4:
postion1=alarmHphm.Find(L"*");
Hphm.SetAt(postion1,'*');
postion2=alarmHphm.Find(L"*",postion1+1);
Hphm.SetAt(postion2,'*');
postion3=alarmHphm.Find(L"*",postion2+1);
Hphm.SetAt(postion3,'*');
postion4=alarmHphm.Find(L"*",postion3+1);
Hphm.SetAt(postion4,'*');
break;
case 5:
postion1=alarmHphm.Find(L"*");
Hphm.SetAt(postion1,'*');
postion2=alarmHphm.Find(L"*",postion1+1);
Hphm.SetAt(postion2,'*');
postion3=alarmHphm.Find(L"*",postion2+1);
Hphm.SetAt(postion3,'*');
postion4=alarmHphm.Find(L"*",postion3+1);
Hphm.SetAt(postion4,'*');
postion5=alarmHphm.Find(L"*",postion4+1);
Hphm.SetAt(postion5,'*');
break;
default:
break;
}
}
return Hphm;
}

調用
CString hphm=AnalyseStr("京P12**5","京P12345");
返回hphm="京P12**5";

#20


沒人提出意見啊?我得出返回值hphm="京P12**5";
與另外一個車牌hphm2 =京P12**5進行比較,
if(hphm==hphm2)
{afxmessagebox("找到車牌");
}else{afxmessagebox(放棄"");}

#21


CString CXXXXtDlg::AnalyseStr(CString alarmHphm,CString Hphm)  
{
   int iLen = alarmHphm.GetLength();
   if(iLen != Hphm.GetLength()) return "";//長度不等
   for(int i=0;i<iLen;i++)
   {
      if(alarmHphm.GetAt(i) == '*') continue;
      if(alarmHphm.GetAt(i) != Hphm.GetAt(i)) return "";//不匹配
   }
   return Hphm;//匹配
}

}

#22


謝謝樓上
給分 祝你早日3顆星 不解釋

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com