【问题标题】:trouble with case insensitive partial matching two strings?不区分大小写的部分匹配两个字符串的麻烦?
【发布时间】:2013-02-11 19:49:37
【问题描述】:

我正在尝试部分匹配两个不区分大小写的字符串。我不想使用 boost 库,因为大多数人的编译器中没有它们。我尝试了标准 c++ 库中的 .find() ,但它只检查用户输入的字符串是否在已经存在的字符串的第一个单词中。比如,如果我有一个名为 Harry_Potter_Goblet 的 DVD,如果我搜索“goblet”或“Goblet”,程序不会显示 Harry_Potter_Goblet 作为结果,只有当我对“Harry”进行区分大小写的搜索时,结果才会显示匹配。我在这里做错了什么?这是我的代码。

【问题讨论】:

  • 您是否阅读 string::find 的文档?它返回第一次出现的位置,所以当然您只能找到以查询字符串开头的标题。您正在将该位置 与 0 进行比较!
  • @us2012 我知道,这就是为什么我要问除了 find() 是否有任何其他函数可以部分匹配两个字符串。
  • 不过,您仍然没有阅读文档。 find() 如果根本找不到字符串,则返回 string::npos,因此您的条件应该是 if (blah.find(foo) != string::npos),瞧,您正在匹配。对于“不区分大小写”部分,请参阅 juan 的回答。

标签: c++ string


【解决方案1】:

定义一个不区分大小写的字符比较函数:

#include <cctype>
bool case_insensitive_comp(char lhs, char rhs)
{
  return std::toupper(lhs) == std::toupper(rhs);
}

然后,使用std::search 查找较大字符串中的子字符串。

#include <algorithm>
....
std::string s1="Harry_Potter_Goblet";
std::string s2 = "goblet";
bool found = std::search(s1.begin(), s1.end(), s2.begin(), s2.end(), case_insensitive_comp) != s1.end();

【讨论】:

  • @juanchopanza 我真的不想使用函数并将它们作为我最后的手段,除了制作函数之外还有其他方法吗?
  • 不错的解决方案。这里可能不需要,但可能对我们这些处理其他语言环境的人有用:您可以使用来自&lt;locale&gt;toupper(charT,const locale&amp;) 而不是来自&lt;cctype&gt; 的那个。
  • @JoshuaJones:你可以使用 lambda
  • @JoshuaJones 将仿函数对象算作函数吗?但说真的,如果您有其他限制,您可能应该在问题中指定它们。
  • @juanchopanza 是的,这是一个学校项目,如果我们决定不使用函数,我们不能混合函数,而且我没有使用函数完成了 70% 的工作,所以我真的此时不想使用函数。
猜你喜欢
  • 2014-09-07
  • 2014-10-26
  • 2013-05-03
  • 2017-12-09
  • 2018-04-28
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多