用递归算法解决VC中CEdit的一个Bug

艾琳丝smile

艾琳丝smile

2016-02-19 16:21

在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享用递归算法解决VC中CEdit的一个Bug,希望可以对大家能有小小的帮助。

摘要 Visual C++ 是Microsoft编程工具中的老大,它功能强大,使用它几乎可以开发Windows平台上的任何程序。但同时由于其功能强大,涉及面广而让人很难进入VC++的门槛。由于是Microsoft开发工具的拳头产品,发布前都要经过严格的测试,同时不断地升级维护,因此,其中常用的功能很难发现Bug,一旦存在Bug则很难解决。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  关键词 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报文等),那么严重的问题将会发生。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  问题分析

  这是一个非常棘手的问题,存在以下关键必须解决:

  ⑴ 确定这个问题中的空格是用户需要的,被用户手工输入的还是通过我们上述方法形成的;

  ⑵ 每次输入字符后,不能取得当前输入行的字符串;

  ⑶ 不能取得分隔每行的标志,比如回车换行等;

  ⑷ 假如在编辑框中存在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("");
while(nPos != -1)
{
 strExchange = strText.Left(nPos);
 strText = strText.Right(strText.GetLength() - nPos -2);
 TrimEndNull(nMaxCols, strExchange, nMaxCols);
 strObjText = strObjText + strExchange + "";
 nPos = strText.Find("");
}
strExchange = strText;
TrimEndNull(nMaxCols, strExchange, nMaxCols);
strObjText = strObjText + strExchange;
pEdit-SetWindowText(strObjText);
UpdateWindow();

  递归函数如下:

TrimEndNull(int nPos, CString &strExchange, const int nMaxCols)
{
 if (nPos = strExchange.GetLength())
  return;
 if (strExchange.GetAt(nPos) == ' ')
 {
  strExchange = strExchange.Left(nPos) +
  strExchange.Right(strExchange.GetLength() - nPos - 1);
 }
 nPos = nPos + nMaxCols;
 TrimEndNull(nPos, strExchange, nMaxCols);
}

  现在程序运行结果如下:

  原始输入

  替换后

  输入A,B后,能够输满编辑框

  结束语

  本文主要讨论了解决VC++中的CEdit控件的一个Bug,使用了大家熟习的递归算法,通过对这个Bug的分析,使用递归算法后,这个难于解决的问题就变得很简单了。

展开更多 50%)
分享

猜你喜欢

用递归算法解决VC中CEdit的一个Bug

编程语言 网络编程
用递归算法解决VC中CEdit的一个Bug

由一个vc内嵌asm的BUG引出的...

编程语言 网络编程
由一个vc内嵌asm的BUG引出的...

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

VC中定义一个链表类

编程语言 网络编程
VC中定义一个链表类

VC中如何处理CEDIT的KEYDOWN事件?

编程语言 网络编程
VC中如何处理CEDIT的KEYDOWN事件?

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

TEmbeddedwb的一个小bug

编程语言 网络编程
TEmbeddedwb的一个小bug

一个好用的VC DBGRID

编程语言 网络编程
一个好用的VC DBGRID

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

ASP入门基础教程-防止或允许更改应用程序变量值

ASP入门基础教程-防止或允许更改应用程序变量值

试卷自动生成系统的开发与应用

试卷自动生成系统的开发与应用
下拉加载更多内容 ↓