热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MFC中用CStringFind写的查找代码,为什么只能查到出现的第一个目标?

如题,为什么只能查找到第一个目标就结束了,如果文档中还存在目标内容的话不会再继续查找,这是什么情况?代码如下,有大神可以帮忙的吗?voidCNotePad1View::OnFindNex
如题,为什么只能查找到第一个目标就结束了,如果文档中还存在目标内容的话不会再继续查找,这是什么情况?
代码如下,有大神可以帮忙的吗?

void CNotePad1View::OnFindNext(LPCTSTR lpszFind, BOOL bNext, BOOL bCase)
{
// TODO: Add your specialized code here and/or call the base class
CEdit& m_strTextct = this->GetEditCtrl();
CString m_strText;
m_strTextct.GetWindowTextW(m_strText);

int textPosition = m_strText.Find(lpszFind);
if (textPosition == -1)
{
MessageBox(_T("未找到该内容,请重新输入"), _T("失败了"), MB_ICONSTOP | MB_OK);
}

m_strTextct.SetFocus();
m_strTextct.SetSel(textPosition, wcslen(lpszFind) + textPosition);
CEditView::OnFindNext(lpszFind, bNext, bCase);
}


在线等

18 个解决方案

#1



int nStart=0;//先从头开始找

int textPosition = m_strText.Find(lpszFind,nStart);

if (textPosition == -1)
{
MessageBox(_T("未找到该内容,请重新输入"), _T("失败了"), MB_ICONSTOP | MB_OK);
    }else{

while (textPosition>=0)//找到第一个后就继续找
{
nStart = textPosition+1;
textPosition = m_strText.Find(lpszFind,nStart);
}
}

#2


int CString::Find( LPCTSTR pstr, int nStart ) const;
要指定从哪个字符开始,否则总是从0开始。

#3


引用 1 楼 i03630211 的回复:

int nStart=0;//先从头开始找

int textPosition = m_strText.Find(lpszFind,nStart);

if (textPosition == -1)
{
MessageBox(_T("未找到该内容,请重新输入"), _T("失败了"), MB_ICONSTOP | MB_OK);
    }else{

while (textPosition>=0)//找到第一个后就继续找
{
nStart = textPosition+1;
textPosition = m_strText.Find(lpszFind,nStart);
}
}



调试后是有问题的,不能查找了已经……什么情况?

#4


引用 2 楼 piaobotudou 的回复:
int CString::Find( LPCTSTR pstr, int nStart ) const;
要指定从哪个字符开始,否则总是从0开始。


直接把这句加进去?

#5


引用 3 楼 Sympastics 的回复:
Quote: 引用 1 楼 i03630211 的回复:


int nStart=0;//先从头开始找

int textPosition = m_strText.Find(lpszFind,nStart);

if (textPosition == -1)
{
MessageBox(_T("未找到该内容,请重新输入"), _T("失败了"), MB_ICONSTOP | MB_OK);
    }else{

while (textPosition>=0)//找到第一个后就继续找
{
nStart = textPosition+1;
textPosition = m_strText.Find(lpszFind,nStart);
}
}



调试后是有问题的,不能查找了已经……什么情况?

贴出你的代码

#6


那需要自己去实现循环查找~

#7


引用 5 楼 i03630211 的回复:
Quote: 引用 3 楼 Sympastics 的回复:

Quote: 引用 1 楼 i03630211 的回复:


int nStart=0;//先从头开始找

int textPosition = m_strText.Find(lpszFind,nStart);

if (textPosition == -1)
{
MessageBox(_T("未找到该内容,请重新输入"), _T("失败了"), MB_ICONSTOP | MB_OK);
    }else{

while (textPosition>=0)//找到第一个后就继续找
{
nStart = textPosition+1;
textPosition = m_strText.Find(lpszFind,nStart);
}
}



调试后是有问题的,不能查找了已经……什么情况?

贴出你的代码




void CNotePad1View::OnFindNext(LPCTSTR lpszFind, BOOL bNext, BOOL bCase)
{
// TODO: Add your specialized code here and/or call the base class
CEdit& m_strTextct = this->GetEditCtrl();
CString m_strText;
m_strTextct.GetWindowTextW(m_strText);
int n_Start = 0;
int textPosition = m_strText.Find(lpszFind,n_Start);
if (textPosition == -1)
{
MessageBox(_T("未找到该内容,请重新输入"), _T("失败了"), MB_ICONSTOP | MB_OK);
}
else
{
while(textPosition >= 0)
{
n_Start = textPosition + 1;
textPosition = m_strText.Find(lpszFind,n_Start);
}
}

m_strTextct.SetFocus();
m_strTextct.SetSel(textPosition, wcslen(lpszFind) + textPosition);
CEditView::OnFindNext(lpszFind, bNext, bCase);
}

#8


引用 7 楼 Sympastics 的回复:
Quote: 引用 5 楼 i03630211 的回复:

Quote: 引用 3 楼 Sympastics 的回复:

Quote: 引用 1 楼 i03630211 的回复:


int nStart=0;//先从头开始找

int textPosition = m_strText.Find(lpszFind,nStart);

if (textPosition == -1)
{
MessageBox(_T("未找到该内容,请重新输入"), _T("失败了"), MB_ICONSTOP | MB_OK);
    }else{

while (textPosition>=0)//找到第一个后就继续找
{
nStart = textPosition+1;
textPosition = m_strText.Find(lpszFind,nStart);
}
}



调试后是有问题的,不能查找了已经……什么情况?

贴出你的代码




void CNotePad1View::OnFindNext(LPCTSTR lpszFind, BOOL bNext, BOOL bCase)
{
// TODO: Add your specialized code here and/or call the base class
CEdit& m_strTextct = this->GetEditCtrl();
CString m_strText;
m_strTextct.GetWindowTextW(m_strText);
int n_Start = 0;
int textPosition = m_strText.Find(lpszFind,n_Start);
if (textPosition == -1)
{
MessageBox(_T("未找到该内容,请重新输入"), _T("失败了"), MB_ICONSTOP | MB_OK);
}
else
{
while(textPosition >= 0)
{
n_Start = textPosition + 1;
textPosition = m_strText.Find(lpszFind,n_Start);
}
}

m_strTextct.SetFocus();
m_strTextct.SetSel(textPosition, wcslen(lpszFind) + textPosition);
CEditView::OnFindNext(lpszFind, bNext, bCase);
}

怎么不能查了,在查之前打印出你的m_strText和lpszFind获取的是否是正确的,然后自己比对结果

#9


n_Start = textPosition + 1; 
为什么 只加 1, 那个 找到的 串的 长度 呢 ?

#10


引用 8 楼 i03630211 的回复:
Quote: 引用 7 楼 Sympastics 的回复:

Quote: 引用 5 楼 i03630211 的回复:

Quote: 引用 3 楼 Sympastics 的回复:

Quote: 引用 1 楼 i03630211 的回复:


int nStart=0;//先从头开始找

int textPosition = m_strText.Find(lpszFind,nStart);

if (textPosition == -1)
{
MessageBox(_T("未找到该内容,请重新输入"), _T("失败了"), MB_ICONSTOP | MB_OK);
    }else{

while (textPosition>=0)//找到第一个后就继续找
{
nStart = textPosition+1;
textPosition = m_strText.Find(lpszFind,nStart);
}
}



调试后是有问题的,不能查找了已经……什么情况?

贴出你的代码




void CNotePad1View::OnFindNext(LPCTSTR lpszFind, BOOL bNext, BOOL bCase)
{
// TODO: Add your specialized code here and/or call the base class
CEdit& m_strTextct = this->GetEditCtrl();
CString m_strText;
m_strTextct.GetWindowTextW(m_strText);
int n_Start = 0;
int textPosition = m_strText.Find(lpszFind,n_Start);
if (textPosition == -1)
{
MessageBox(_T("未找到该内容,请重新输入"), _T("失败了"), MB_ICONSTOP | MB_OK);
}
else
{
while(textPosition >= 0)
{
n_Start = textPosition + 1;
textPosition = m_strText.Find(lpszFind,n_Start);
}
}

m_strTextct.SetFocus();
m_strTextct.SetSel(textPosition, wcslen(lpszFind) + textPosition);
CEditView::OnFindNext(lpszFind, bNext, bCase);
}

怎么不能查了,在查之前打印出你的m_strText和lpszFind获取的是否是正确的,然后自己比对结果



真的查询不了啊,直接不响应了……

#11


你自己单步调试吧,看不出什么问题

#12



n_Start = textPosition + 1  +  lpszFind->GetLength();

#13


while循环一下就好了  查找一个 再查找下一个就行了呗

#14


引用 12 楼 schlafenhamster 的回复:
n_Start = textPosition + 1  +  lpszFind->GetLength();


红色字体添加的部分是什么意思?

#15


引用 12 楼 schlafenhamster 的回复:
n_Start = textPosition + 1  +  lpszFind->GetLength();


lpszFind 报错,显示为:expression must have pointer-to-class type,说明类是不对的……

#16


找到 第一个 字符串后, 返回的是 该 字符串的 头一个 字符的位置, 找  下 个 的 时候 , 开始 位置 在 字符串的 尾部。

可以  strlen( lpszFind)

或者 _tcslen :

求Unicode字符串的长度,使用跟非Unicode的strlen一样 

#17


引用 16 楼 schlafenhamster 的回复:
找到 第一个 字符串后, 返回的是 该 字符串的 头一个 字符的位置, 找  下 个 的 时候 , 开始 位置 在 字符串的 尾部。

可以  strlen( lpszFind)

或者 _tcslen :

求Unicode字符串的长度,使用跟非Unicode的strlen一样 


用 _tcslen(lpszFind)编译通过了,但是运行的时候还是直接不查找了,应该是逻辑的问题了,一天就被这一个问题给缠住了………

#18


循环查找,注意unicode字符串。

推荐阅读
  • IneedtofocusTextCellsonebyoneviaabuttonclick.ItriedlistView.ScrollTo.我需要通过点击按钮逐个关注Tex ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文探讨了如何优化和正确配置Kafka Streams应用程序以确保准确的状态存储查询。通过调整配置参数和代码逻辑,可以有效解决数据不一致的问题。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文介绍如何使用 Python 将一个字符串按照指定的行和元素分隔符进行两次拆分,最终将字符串转换为矩阵形式。通过两种不同的方法实现这一功能:一种是使用循环与 split() 方法,另一种是利用列表推导式。 ... [详细]
  • 本文介绍如何通过注册表编辑器自定义和优化Windows文件右键菜单,包括删除不需要的菜单项、添加绿色版或非安装版软件以及将特定应用程序(如Sublime Text)添加到右键菜单中。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
author-avatar
本人忆苦思甜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有