总结:如何在c++中进行大小写忽略的比较,基于std:string

ref1,ref2,ref3

问题由来:

标准字符 (typedef basic_string<char> string)由于国际化过程中,没有实现每一种语言的大小写转换函数,也没要提供基于ansi字符的大小写忽略比较。

解决方案1:先转换大小写再比较

策略1. std method

C++ — Convert string to upper/lower case

To convert an std::string to upper case you can use the following:

#include <algorithm>
#include <string>
…
std::string data = “Abc”;
std::transform(data.begin(), data.end(),
data.begin(), ::toupper);

For converting to lower case, you need to replace::toupper with ::tolower.

If you really hate tolower(), here's an alternative:

char easytolower(char in){if(in<='Z' && in>='A')return in-('Z'-'z');return in;
} std::transform(data.begin(), data.end(), data.begin(), easytolower);

策略2. boost method

There is a Boost string algorithm for this:

#include <boost/algorithm/string.hpp>    std::string str = "HELLO, WORLD!";
boost::algorithm::to_lower(str);

解决方案2:直接比较

策略1

Boost includes a handy algorithm for this:

#include <boost/algorithm/string.hpp>std::string str1 = "hello, world!";
std::string str2 = "HELLO, WORLD!";if (boost::iequals(str1, str2))
{// Strings are identical
}

策略2

Take advantage of the standard char_traits. Recall that a std::string is in fact a typedef for std::basic_string<char>, or more explicitly,std::basic_string<char, std::char_traits<char> >. The char_traits type describes how characters compare, how they copy, how they cast etc. All you need to do is typedef a new string over basic_string, and provide it with your own customchar_traits that compare case insensitively.

struct ci_char_traits : public char_traits<char> {static bool eq(char c1, char c2) { return toupper(c1) == toupper(c2); }static bool ne(char c1, char c2) { return toupper(c1) != toupper(c2); }static bool lt(char c1, char c2) { return toupper(c1) <  toupper(c2); }static int compare(const char* s1, const char* s2, size_t n) {while( n-- != 0 ) {if( toupper(*s1) < toupper(*s2) ) return -1;if( toupper(*s1) > toupper(*s2) ) return 1;++s1; ++s2;}return 0;}static const char* find(const char* s, int n, char a) {while( n-- > 0 && toupper(*s) != toupper(a) ) {++s;}return s;}
};typedef std::basic_string<char, ci_char_traits> ci_string;

策略3

bool caseInsensitiveStringCompare(const string& str1, const string& str2) {if (str1.size() != str2.size()) {return false;}for (string::const_iterator c1 = str1.begin(), c2 = str2.begin(); c1 != str1.end(); ++c1, ++c2) {if (tolower(*c1) != tolower(*c2)) {return false;}}return true;
}

策略5

The trouble with boost is that you have to link with and depend on boost. Not easy in some cases (e.g. android).

And using char_traits means all your comparisons are case insensitive, which isn't usually what you want.

This should suffice. It should be reasonably efficient. Doesn't handle unicode or anything though.

bool iequals(const string& a, const string& b)
{unsigned int sz = a.size();if (b.size() != sz)return false;for (unsigned int i = 0; i < sz; ++i)if (tolower(a[i]) != tolower(b[i]))return false;return true;
}

策略6

ere is a method of doing this, although it does transforming the strings, and is not Unicode friendly, it should be portable which is a plus:

bool caseInsensitiveStringCompare( const std::string& str1, const std::string& str2 ) {std::string str1Cpy( str1 );std::string str2Cpy( str2 );std::transform( str1Cpy.begin(), str1Cpy.end(), str1Cpy.begin(), ::tolower );std::transform( str2Cpy.begin(), str2Cpy.end(), str2Cpy.begin(), ::tolower );return ( str1Cpy == str2Cpy );
}

c++,string,compare,nocase,for copy相关推荐

  1. 《C++ Primer 第五版》(第2.5节,第3.1-3.4节) ——采用预处理功能编写头文件,string初始化和字符操作,vector初始化和迭代器

    1.采用预处理功能编写头文件 在头文件定义(头文件中的内容是只能被定义一次的实体)过程中,为了防止头文件重复包含的情况,采用预处理器的一个头文件保护符功能,格式为:{  #ifndef 预处理变量(通 ...

  2. JAVA,String转JSON过程中,json值里面带有英文引号无法解析的问题

    json值里面带有英文引号无法解析的问题 示例 解决方式,替换英文引号 示例 如图:万千宠爱,是由中文引号,不会造成解析失败 购好物,是英文引号,解析失败 解决方式,替换英文引号 public sta ...

  3. java学习(109):StringBuilder,stringbuffer,string区别

    String.StringBuffer和StringBuilder区别 1.长度是否可变 String 是被 final 修饰的,他的长度是不可变的,就算调用 String 的concat 方法,那也 ...

  4. java问题解读,String类为什么是final的

    一.理解final 望文生义,final意为"最终的,最后的",我理解为"不能被改变的",它可以修饰类.变量和方法. 所以我是否可以理解为被它所修饰的类.变量和 ...

  5. C# 编程入门第二课 注释变量,VS2019快捷键,String和string,命名规则,赋值运算符,+号作用占位符,转义字符算术运算符,类型转换

    C# 编程入门第二课 文章目录 C# 编程入门第二课 1. 注释 2 变量 3.VS2019快捷键 4. String和string 5. 命名规则 6. 赋值运算符,+号作用 7. 占位符 8.转义 ...

  6. 【Java10】lambda表达式(函数式编程),Stream流,File类,字节/字符流,乱码,缓冲/转换/序列化/打印流,Properties

    文章目录 1.lambda表达式标准语法:()->{} 2.lambda表达式简略语法:可推导即可省略 3.lambda表达式原理:lambda效率比匿名内部类高 4.两个函数式接口:Consu ...

  7. 字节跳动面试流程以及注意事项,各大厂具有通点,看看不吃亏!

    第一面: 第一面主要考察基础,先简单自我介绍,以及介绍一下项目,然后开始考察基础. TCP相关基础知识 问题1:请详细描述三次握手和四次挥手的过程 要求熟悉三次握手和四次挥手的机制,要求画出状态图. ...

  8. C++中有string类,string是一个类不是一种类型,c语言中没有

    前言: string 的角色 1 string 使用 1.1 充分使用string 操作符 1.2 眼花缭乱的string find 函数 1.3 string insert, replace, er ...

  9. C++ string使用介绍(非常全面,详细)

    目录 string的初始化 1.常见初始化方式 string对象的操作 1.用cin获取键盘输入的值 2.用getline读取一整行 4.比较string的大小 5.两个string对象相加 5.1 ...

最新文章

  1. 近世代数--子环--怎么判断是不是子环?
  2. 基于移位寄存器的序列密码
  3. es6 --- 使用proxy对数据进行劫持
  4. pip download timeout 下载慢,超时解决方法
  5. 不可忽视的MySQL字符集
  6. java网站开发模式有哪些_第7章JavaWeb常用开发模式.ppt
  7. python之迷宫小游戏
  8. 朱光潜给青年的十二封信 之 谈升学和选课
  9. 相信我,这些web前端技术会让你虎躯一震
  10. java微信扫码支付_java 微信扫码支付 示例代码
  11. 学Python真的好找工作吗?资深程序员为你解答
  12. 基于微信的旅游小程序、景区景点购票小程序、毕业设计、开题报告、毕业论文参考(1)小程序
  13. 2019各大互联网公司校园招聘流程
  14. 边缘计算的100个术语
  15. Qt5:输入控件 QPushButton/ QToolButton/ QRadioButton/ QCheckBox/ QTextEdit/ QComboBox/ QSpinBox/ QLabel
  16. 爬虫:爬东方财富网股票数据
  17. ​predis操作大全​
  18. 利用swagger组件测试excel下载,打开文件乱码。
  19. jsp汽车租赁系统ssh
  20. smi时序_详解芯片组上电时序.ppt

热门文章

  1. Xcode 报错 xcrun: error: active developer path(/Applications/Xcode.app/Contents/...does not exist问题解决。
  2. Vue中 使用 calc 计算长度并传参
  3. 推荐一款开源的图片无损放大神器
  4. 【Zabbix_6.x 第一章】概述、功能、术语、架构
  5. mysql部分繁体字无法保存
  6. 徐小平关于区块链的言论是否言过其实
  7. Cool Edit Pro 2.1 专业特别版
  8. 阿里云七夕密码情书免费领取Git命令超大鼠标垫(附答案)
  9. 我的LLVM学习笔记——OLLVM混淆研究之FLA篇
  10. 华为手机便签删了怎么找回