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

2016-02-19 16:21 17 1 收藏

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

【 tulaoshi.com - 编程语言 】

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

  关键词 Visual C++; 控件; Bug; Debug

  控件是Visual C++中的被封装的一个类,使用控件,我们能够很快的开发OOP程序; Bug是程序中的错误; Debug就是在程序运行期间进行调试。

  Bug描述

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

  如下图所示界面:

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://www.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的分析,使用递归算法后,这个难于解决的问题就变得很简单了。

来源:http://www.tulaoshi.com/n/20160219/1611787.html

延伸阅读
《巫师2》发现一个任务bug 会员:wjb007 杂谈 关于焚香味道和梦想商店两个关联任务。 首先可以在水边一个人那里接到焚香味道这个任务,要得到焚香店的秘方。 然后焚香店门口就会出现一群人要求焚香店关门,接到梦想商店任务。 然后跟老板对话,第一个选项是要秘方的。后面有个选项问他是否有出售毒品,只要几句话,就可以完成任务,店铺关门...
《黑道圣徒2》一个有趣的小bug 在金字塔计划那关里,有一关是要炸掉实验室。 但之前要通往秘密通道(貌似是个下水道出水口)。 此时你的三王之一强尼.盖特(就是平头纹身戴眼镜的那个)应该跟在你的身后。 通过秘密通道后,在秘密通道的出口前,会发现有两个强尼盖特在你队伍里。 一个在出口外端着AK等你,一个则跟在你身后的秘密通道里停住...
VC执行一个不带参数的存储过程,返回一个记录集:  m_pRecordSet.CreateInstance("ADODB.Recordset");  #ifdef _DEBUG  if (m_pRecordSet == NULL)  {   AfxMessageBox("RecordSet 对象创建失败! 请确认是否初始化了COM环境.");   return;  }  #endif  ASSERT(m_pRecordSet != NULL);  CStri...
标签: 设计
我们在做每一个设计的时候,都应该计划能够解决一个问题。喜欢讨论商业模式的人会称呼其为卖点,而对创作的人而言,这就是产品的价值所在。 在整个设计的过程中,我们会进行很多情景假设,但是无论最后的成果如何,我们首先考虑的最应该是我们成功解决了么。 感性的功能设计 vRS Mega Man-Pram是斯柯达随着第三代明锐vRS一起发布的一款婴儿...
随然这个问题可能很多人都没有遇到过,但遇到过的朋友相信和我一样,都经过了一断时间的问题查找才解决,为了减少这样的问题给你带来烦恼,在此我写下此文,希望对大家有所帮助。     你是否在创建JVM是老返回-1,即JNI_ERR;总么检查程序都没有发现任可问题,编译也不会出错。动态链接库文件“jvm.dll”已经放...

经验教程

600

收藏

37
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部