摘要visual c++ 是microsoft程式設計工具中的
老大,它功能強大,使用它幾乎可以開發windows平台上的任何程式。但同時由於其功能強大,涉及面廣而讓人很難進入vc++的
門檻。由於是microsoft開發工具的拳頭產品,發布前都要經過嚴格的測試,同時不斷地公升級
維護,因此,其中常用的功能很難發現bug,一旦存在bug則很難解決。
visual c++; 控制項; bug; debug
控制項是visual c++中的被封裝的乙個類,使用控制項,我們能夠很快的開發oop程式; bug是程式中的錯誤; debug就是在程式執行期間進行除錯。
bug描述
如下圖所示介面:
figure 1
按confirm按鈕,debug介面如下:
figure 2
從strtext的值可以看出,figure 1中的輸入內容沒有" ",並且figure 1中的內容被限制輸入6×10個字元,每行最多為20個字元,現在對figure1 中的內容作如下修改:
刪除第三行的8,9兩個字元,也就是說figure 1中的內容現在只有58個字元,用空格替換figure 1中內容的第一行與第二行的最後乙個字元,如圖:
figure 3
現在如果在第一行與第二行中間分別加乙個字元,出現如下介面:
figure 4
那麼我想問大家乙個問題,在第三行中還能輸入幾個字元? 答案是:不能輸入字元,同時在內容的任何地方都不能輸入字元。通過debug我們能夠知道其中的原因,請看debug介面:
figure 5
從figure 5中,我們能夠看見,被替換的字元(空格)在figure 4沒有被顯示出來,同時第一行與第二行中變成了21個字元。少數這樣的情況能夠讓使用者明白,同時能夠方便地修改輸入內容,但如果存在大量這種情況,則就是乙個嚴重的問題了,比如:如果上面的文字中有1000行,每行有10個字元,同時有200個上述替換,那麼,表現給使用者的是:如果使用者要填滿編輯框的話,編輯框中有200個字元不能輸入,有200行中的每行內容是11個字元。同時,如果程式的後續處理對上面輸入的每行的字元有嚴格要求的話(比如銀行國際業務
結算使用的swift報文等),那麼嚴重的問題將會發生。
問題分析
這是乙個非常棘手的問題,存在以下關鍵必須解決:
⑴ 確定這個問題中的空格是使用者需要的,被使用者手工輸入的還是通過我們上述方法形成的;
⑵ 每次輸入字元後,不能取得當前輸入行的字串;
⑶ 不能取得分隔每行的標誌,比如回車換行等;
⑷ 假如在編輯框中存在100行,每行長度為10,那麼如果超過10行存在那樣的問題的話,也很難確定。
解決問題的演算法
針對以上存在的問題,在取得編輯框的內容後,可以使用遞迴演算法來過濾掉相關輸入。
演算法思想:
從第一行開始,以回車換行為一次遞迴呼叫,把每次的結果加起來。遞迴的思路是:根據每行最大的字元數,對每行進行判斷,如果最後乙個字元是空格,則把那個空格刪除,最後,把不需要的空格都刪除掉了。呼叫程式如下:
cstring strtext, strobjtext, strexchange;
cedit *pedit;
updatewindow();
pedit = (cedit *)getdlgitem(idc_et_con);
int npos = 0, nlen = 0;
int nmaxcols = 20;
strobjtext = "";
pedit->getwindowtext(strtext);
npos = strtext.
find
("/r/n");
while(npos != -1)
strexchange = strtext;
trimendnull(nmaxcols, strexchange, nmaxcols);
strobjtext = strobjtext + strexchange;
pedit->setwindowtext(strobjtext);
updatewindow();
遞迴函式如下:
trimendnull(int npos, cstring &strexchange, const int nmaxcols)
npos = npos + nmaxcols;
trimendnull(npos, strexchange, nmaxcols);
}現在程式執行結果如下:
原始輸入
替換後
輸入a,b後,能夠輸滿編輯框
結束語
本文主要討論了解決vc++中的cedit控制項的乙個bug,使用了大家熟習的遞迴演算法,通過對這個bug的分析,使用遞迴演算法後,這個難於解決的問題就變得很簡單了。
用遞迴演算法解決上車人數問題
題目 1.公共汽車第1站開出,在始發站上車的人數為a,到達第2站,在第2站有人上 下車,但上 下車的人數相同,第3站起 包括第3站 上 下 車的人數有一定的規律 上車的人數都是前兩站上車人數之和 下車人數等於上一站上車人數 一直到終點站的前一站 第n 1站 都滿足此規律。現給出的條件是 共有n個車站...
VC中實現彈出CEdit的氣泡提示框
使用編輯框自帶的氣泡提示框,檢視cedit的原始碼能看到如下兩個函式 afx inline bool cedit showballoontip in z lpcwstr lpsztitle in z lpcwstr lpsztext in int ttiicon afx inline bool ce...
C 用遞迴演算法解決經典揹包問題
1.引子 我們人類是一種貪婪的動物,如果給您乙個容量一定的揹包和一些大小不一的物品,裝到揹包裡面的物品就歸您,遇到這種好事大家一定不會錯過,用力塞不一定是最好的辦法,用腦子才行,下面就教您如何解決這樣的問題,以獲得更多的獎品。2.應用場景 在乙個物品向量中找到乙個子集滿足條件如下 1 這個子集加起來...