vc++ 的edit控件如何统计单词数

我建立了一个工程工程中有一个edit控件名叫edit2,向控件中输入一段文字,要求在IDC_STATIC2中实时显示当前的字符数。我写了这个函数,基本原理是:只要字母前是... 我建立了一个工程
工程中有一个edit控件 名叫edit2,向控件中输入一段文字,要求在IDC_STATIC2中实时显示当前的字符数。我写了这个函数,基本原理是:只要字母前是空格,那么单词数就加1.
但是显示的单词数和实际单词数总是有误差,原因是字母前是回车的情况没有考虑到,那么如何判断这个回车呢?
另外,如果每次执行OnEnChangeEdit2()这个函数的时候,单词统计都从头开始,在字数比较多的时候,效率就成了问题。所以,我就在字符数加1的时候,做了这样一个处理
if ((len-lenbefore)==1){
if ((str.GetAt(len)>=65&&str.GetAt(len)<=90||str.GetAt(len)>=97&&str.GetAt(len)<=122)&&(str.GetAt(len-1)==32)) a=a+1;
n.Format("Word Count: %d",a+1);
GetDlgItem(IDC_STATIC2)->SetWindowText(n);
lenbefore=len;
}
这样就带来一个问题,如果某人输了ssssssssss这样一段文字
然后拦腰加上一个空格 变成这样ssss ssssss 我的这个方法就统计不准了
怎么解决呢?
小弟求助各位高手 高分 事后再加分

另外,这个函数中所有的变量都已经定义。
附完整的消息处理函数
void CWritingDlg::OnEnChangeEdit2()
{
CString str;
CString n;
int a=0;
CString tmp = "";
GetDlgItem(IDC_EDIT2)->GetWindowText(str);
//MessageBox(str);
//str=str.Replace( '\r\n'," " );
if (str==""||str==" ") GetDlgItem(IDC_STATIC2)->SetWindowText("Word Count: 0");
int len = str.GetLength();
TCHAR chTmp ='\0';
if ((len-lenbefore)!=1&&len!=2)
{for(int i=0;i<len-1;)
{
chTmp = str.GetAt(i);
if (chTmp ==32 )
{
if ((str.GetAt(i+1)>=65&&str.GetAt(i+1)<=90)||(str.GetAt(i+1)>=97&&str.GetAt(i+1)<=122)) a++;

}

i++;
n.Format("Word Count: %d",a+1);
GetDlgItem(IDC_STATIC2)->SetWindowText(n);
lenbefore=len;
}

if ((len-lenbefore)==1){
if ((str.GetAt(len)>=65&&str.GetAt(len)<=90||str.GetAt(len)>=97&&str.GetAt(len)<=122)&&(str.GetAt(len-1)==32)) a=a+1;
n.Format("Word Count: %d",a+1);
GetDlgItem(IDC_STATIC2)->SetWindowText(n);
lenbefore=len;
}
}

// TODO: 如果该控件是 RICHEDIT 控件,则它将不会
// 发送该通知,除非重写 CDialog::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask(),
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

// TODO: 在此添加控件通知处理程序代码
}
展开
 我来答
百度网友1d8e8b9
推荐于2016-07-20 · TA获得超过913个赞
知道小有建树答主
回答量:589
采纳率:60%
帮助的人:323万
展开全部
很简单。就是一个非常简单的词法分析器。

void CWritingDlg::OnEnChangeEdit2()
{
CString str;
GetDlgItem( IDC_EDIT2 )->GetWindowText( str );
LPCTSTR lpszstr = ( LPCTSTR ) str;
int c = 0;
int i = 0;
int s = 0;

while( lpszstr[ i ] != _T('\0'))
{
if( s == 0 )
{
if( lpszstr[ i ] !=_T(' ') &&
lpszstr[ i ] != _T('\t') &&
lpszstr[ i ] != _T('\r')&&
lpszstr[ i ] != _T('\n'))
s = 1;
}
else
{
if( lpszstr[ i ] == _T(' ') ||
lpszstr[ i ] == _T('\t') ||
lpszstr[ i ] == _T('\r')||
lpszstr[ i ] == _T('\n'))
{
c++;
s = 0;
}
}
i ++;
}
if( s == 1 )
c++;

// 现在,C里面的值,就是单词的个数。
str.Format( _T("%d"), c );
SetDlgItemText( IDC_STATIC2, str );
}

算法思想:非常简单的有穷自动状态机,切换状态的关键在于空白字符。
统计单词个数时,连续多个空格、回车、制表符或其任意组合,都将视作一个分隔符。

如果单词之间的其它符号比如“%”、“,”等标点符号应该算作分割符的话,仅需要简单的修改即可。
lz3272
2009-08-04 · TA获得超过333个赞
知道小有建树答主
回答量:258
采纳率:0%
帮助的人:354万
展开全部
void CCListIconDlg::OnChangeEdit1()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.

// TODO: Add your control notification handler code here

CString strTemp;
((CEdit*)(GetDlgItem(IDC_EDIT1)))->GetWindowText(strTemp);
int Num = 0;
if (strTemp.GetLength())
{
Num = 1;
}
int n = strTemp.Remove(' ');
CString str;
str.Format("%d",n + Num);
MessageBox(str);
}
//如果还要判断回车 就自己再加 strTemp.Remove('\n');然后再加在一起就是单词个数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友bdb85b1a6
2009-08-03 · TA获得超过697个赞
知道小有建树答主
回答量:1698
采纳率:0%
帮助的人:387万
展开全部
留着,明天再做。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式