用遞迴演算法解決VC中CEdit的乙個Bug

2021-04-02 12:39:31 字數 2391 閱讀 9316

摘要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 這個子集加起來...