不区分大小写的字符串:: find

时间:2011-02-09 10:44:52

标签: c++

find()是否存在不区分大小写的std::string方法?

4 个答案:

答案 0 :(得分:11)

您可以对两个字符串进行大写并使用常规查找。 (注意:如果您有Unicode字符串,这种方法可能不正确。)

在Boost中,还有ifind_first用于不区分大小写的搜索。 (请注意,它会返回范围而不是size_t)。

#include <string>
#include <boost/algorithm/string/find.hpp>
#include <cstdio>
#include <cctype>

std::string upperCase(std::string input) {
  for (std::string::iterator it = input.begin(); it != input.end(); ++ it)
    *it = toupper(*it);
  return input;
}

int main () {
  std::string foo = "1 FoO 2 foo";
  std::string target = "foo";

  printf("string.find: %zu\n", foo.find(target));

  printf("string.find w/ upperCase: %zu\n", upperCase(foo).find(upperCase(target)));

  printf("ifind_first: %zu\n", boost::algorithm::ifind_first(foo, target).begin() - foo.begin());

  return 0;
}

答案 1 :(得分:3)

在做任何想象之前,先看看

http://www.gotw.ca/gotw/029.htm

并查看是否使用自定义角色特征类不是您想要的。

答案 2 :(得分:2)

这就是我的建议,(与@programmersbook相同)

#include <iostream>
#include <algorithm>
#include <string>

bool lower_test (char l, char r) {
  return (std::tolower(l) == std::tolower(r));
}

int main()
{
  std::string text("foo BaR");
  std::string search("bar");

  std::string::iterator fpos = std::search(text.begin(), text.end(), search.begin(), search.end(), lower_test);
  if (fpos != text.end())
    std::cout << "found at: " << std::distance(text.begin(), fpos) << std::endl;
  return 0;
}

答案 3 :(得分:0)

for(int i=0; i<yourString.length() 
    && tolower(yourString[i])!=yourLoweredChar; i++)
{
    return i;
}
return -1;

如果返回-1,那么你的目标字符不存在

else给出char的第一个出现