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: 在此添加控件通知处理程序代码
} 展开
工程中有一个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: 在此添加控件通知处理程序代码
} 展开
3个回答
展开全部
很简单。就是一个非常简单的词法分析器。
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 );
}
算法思想:非常简单的有穷自动状态机,切换状态的关键在于空白字符。
统计单词个数时,连续多个空格、回车、制表符或其任意组合,都将视作一个分隔符。
如果单词之间的其它符号比如“%”、“,”等标点符号应该算作分割符的话,仅需要简单的修改即可。
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 );
}
算法思想:非常简单的有穷自动状态机,切换状态的关键在于空白字符。
统计单词个数时,连续多个空格、回车、制表符或其任意组合,都将视作一个分隔符。
如果单词之间的其它符号比如“%”、“,”等标点符号应该算作分割符的话,仅需要简单的修改即可。
展开全部
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');然后再加在一起就是单词个数
{
// 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');然后再加在一起就是单词个数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
留着,明天再做。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询