C++ 不区分大小写的部分匹配两个字符串有问题吗?

C++ 不区分大小写的部分匹配两个字符串有问题吗?,c++,string,C++,String,我试图在不区分大小写的情况下部分匹配两个字符串。我不想使用boost库,因为大多数人的编译器上都没有它们。在标准C++库中,我尝试了.FAND(),但是它只检查用户输入的字符串是否在已经存在的字符串的第一个单词中。比如,如果我有一张名为《哈利波特高脚杯》的dvd,如果我搜索“高脚杯”或“高脚杯”,程序不会显示哈利波特高脚杯,只有在我搜索“哈利”时,才会显示匹配结果。我做错了什么?这是我的代码。定义一个不区分大小写的字符比较函数: #include <cctype> bool case

我试图在不区分大小写的情况下部分匹配两个字符串。我不想使用boost库,因为大多数人的编译器上都没有它们。在标准C++库中,我尝试了.FAND(),但是它只检查用户输入的字符串是否在已经存在的字符串的第一个单词中。比如,如果我有一张名为《哈利波特高脚杯》的dvd,如果我搜索“高脚杯”或“高脚杯”,程序不会显示哈利波特高脚杯,只有在我搜索“哈利”时,才会显示匹配结果。我做错了什么?这是我的代码。

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

#include <cctype>
bool case_insensitive_comp(char lhs, char rhs)
{
  return std::toupper(lhs) == std::toupper(rhs);
}
#包括
bool大小写不敏感组件(字符左侧、字符右侧)
{
返回std::toupper(lhs)==std::toupper(rhs);
}
然后,使用查找较大字符串中的子字符串

#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();
#包括
....
std::string s1=“哈利•波特•高脚杯”;
std::string s2=“高脚杯”;
bool found=std::search(s1.begin(),s1.end(),s2.begin(),s2.end(),不区分大小写)!=s1.end();

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

#include <cctype>
bool case_insensitive_comp(char lhs, char rhs)
{
  return std::toupper(lhs) == std::toupper(rhs);
}
#包括
bool大小写不敏感组件(字符左侧、字符右侧)
{
返回std::toupper(lhs)==std::toupper(rhs);
}
然后,使用查找较大字符串中的子字符串

#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();
#包括
....
std::string s1=“哈利•波特•高脚杯”;
std::string s2=“高脚杯”;
bool found=std::search(s1.begin(),s1.end(),s2.begin(),s2.end(),不区分大小写)!=s1.end();

您是否阅读了
string::find
的文档?它返回第一次出现的位置,因此您当然只能找到以查询字符串开头的标题。您正在将该位置与0进行比较@us2012我知道这一点,这就是为什么我要问除了find()之外还有其他函数可以匹配两个字符串的原因。不过,您仍然没有阅读文档
find()
如果它根本找不到字符串,则返回
string::npos
,因此您的条件应该是
if(blah.find(foo)!=string::npos)
并且瞧,您正在匹配。关于“不区分大小写”部分,请参见juan的答案。您是否阅读了
string::find
的文档?它返回第一次出现的位置,因此您当然只能找到以查询字符串开头的标题。您正在将该位置与0进行比较@us2012我知道这一点,这就是为什么我要问除了find()之外还有其他函数可以匹配两个字符串的原因。不过,您仍然没有阅读文档
find()
如果它根本找不到字符串,则返回
string::npos
,因此您的条件应该是
if(blah.find(foo)!=string::npos)
并且瞧,您正在匹配。关于“不区分大小写”的部分,请参见juan的答案。@juanchopanza我真的不想使用函数并将它们作为我的最后手段,除了生成函数还有其他方法吗?很好的解决方案。这里可能不需要,但可能对我们这些处理其他区域设置的人有用:您可以使用
中的
toupper(charT,const locale&)
而不是
@JoshuaJones:您可以使用lambda@JoshuaJones函子对象会算作函数吗?但是说真的,如果你有其他限制,你可能应该在问题中指定它们。@juanchopanza是的,这是一个学校的项目,如果我们决定不使用函数,我们就不能混合函数,我没有使用函数完成70%的工作,所以我现在真的不想使用函数。@juanchopanza我真的不想使用函数并将它们作为我的最后手段,除了生成函数还有别的方法吗?很好的解决方案。这里可能不需要,但可能对我们这些处理其他区域设置的人有用:您可以使用
中的
toupper(charT,const locale&)
而不是
@JoshuaJones:您可以使用lambda@JoshuaJones函子对象会算作函数吗?但是说真的,如果你有其他的限制,你可能应该在问题中指定它们。@juanchopanza是的,这是一个学校的项目,如果我们决定不使用函数,我们就不能混合使用函数,而且我没有在完成70%的工作时使用函数,所以我现在真的不想使用函数。