科技时代新浪首页 > 科技时代 > 软件 > 正文

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


http://www.sina.com.cn 2005年02月21日 09:52 天极yesky

  文/彭建华

  问题分析

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

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

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

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

  ⑷ 假如在编辑框中存在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.Left(nPos);
 strText = strText.Right(strText.GetLength() - nPos -2);
 TrimEndNull(nMaxCols, strExchange, nMaxCols);
 strObjText = strObjText + strExchange + "\r\n";
 nPos = strText.Find("\r\n");
}
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);
}

  现在程序运行结果如下:

用递归算法解决VC中CEdit的一个Bug(2)
  原始输入

用递归算法解决VC中CEdit的一个Bug(2)
  替换后


用递归算法解决VC中CEdit的一个Bug(2)
  输入A,B后,能够输满编辑框

  结束语

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

[上一页]  [1]  [2]


  点击此处查询全部C语言新闻

评论】【应用软件】【推荐】【 】【打印】【下载点点通】【关闭
 

 
新 闻 查 询
关键词



彩 信 专 题
东方美女
迷人风情性感姿态
金鸡送福
恭喜发财图铃拿来
请输入歌曲/歌手名:
更多专题   更多彩信
 
 



科技时代意见反馈留言板 电话:010-82628888-5828   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2005 SINA Inc. All Rights Reserved

版权所有 新浪网