今天跟大家聊聊我昨天刚搞定的一个小实践,关于字符串比较的,叫 `comparenocase`。这名字一听就知道,重点就是忽略大小写。
事情是这样的,昨天在搞一个用户登录的功能,需要验证用户名。一开始直接用的 `==` 来比较用户输入的用户名和数据库里存的用户名,结果就发现个问题,用户注册的时候,大小写随便填的,比如 `User123` 或者 `user123`,数据库里存的可能是 `user123`,然后用户登录的时候如果输 `User123` 就登录不进去了,因为大小写不一样。
这肯定不行,用户体验太差了,总不能要求用户记住自己注册时候用户名的大小写?所以我就开始找解决方案,目标就是实现一个忽略大小写的字符串比较。
我想到的是把两个字符串都转换成小写或者大写,然后再比较。这个方法很简单,也很快就能实现。
c++
#include
#include
#include
using namespace std;
bool compareNoCase(string str1, string str2) {
transform(*(), *(), *(), ::tolower);
transform(*(), *(), *(), ::tolower);
return str1 == str2;
int main() {
string usernameFromInput = "User123";
string usernameFromDatabase = "user123";
if (compareNoCase(usernameFromInput, usernameFromDatabase)) {
cout << "用户名匹配!" << endl;
} else {
cout << "用户名不匹配!" << endl;
return 0;
我先写了个 `compareNoCase` 函数,里面用 `transform` 和 `tolower` 把两个字符串都转成小写,然后用 `==` 比较。
简单测试了一下,没问题,`User123` 和 `user123` 也能匹配了。
但是,我总觉得这个方法有点low,不够优雅。 于是我就开始找有没有现成的库函数可以实现这个功能。
我在网上搜了一下,发现 C++ 的 `string` 类里有个 `compare` 函数,可以用来比较字符串,但是默认是区分大小写的。 不过我找到了另外一种方法,就是用 `std::equal` 结合 `std::tolower` 来实现忽略大小写的比较。
c++
#include
#include
#include
using namespace std;
bool compareNoCase(const string& str1, const string& str2) {
return (*() == *()) &&
equal(*(), *(), *(),
[](char c1, char c2){
return tolower(c1) == tolower(c2);
int main() {
string usernameFromInput = "User123";
string usernameFromDatabase = "user123";
if (compareNoCase(usernameFromInput, usernameFromDatabase)) {
cout << "用户名匹配!" << endl;
} else {
cout << "用户名不匹配!" << endl;
return 0;
这个代码看起来稍微高级一点,用 `std::equal` 遍历两个字符串,然后用 lambda 表达式把每个字符都转成小写再比较。 这样就避免了直接修改原字符串,感觉更安全一点。
我又测试了一下,没问题,也能正常工作。
我选择了使用 `std::equal` 这种方法,因为它更简洁,也更符合我的编码风格。
- 一开始用 `==` 比较字符串,发现区分大小写。
- 然后想到把字符串都转成小写再比较,实现了忽略大小写的功能。
- 使用 `std::equal` 结合 `std::tolower` 实现了更优雅的忽略大小写比较。
这回实践让我对字符串比较有了更深入的了解,也学到了一些新的 C++ 技巧。 希望我的分享对大家有所帮助!