如何比较C语言字符串和C++字符串?

6
我想了解为什么比较函数没有给我正确的结果?
据我的理解,如果两个字符串相同,它应该返回0!
bool validatePassword(char id[], string password) {

    // cannot be the same as the id string
    if(password.compare(id) == 0) {
        cout << "password can not be as same as id\n";
        return false;
    }

    return true;
}

4
无法重现。请提供一个像我链接的那样的最小可复现示例,甚至只需要比较部分即可。 - chris
我猜你可能正在比较类似于"hoge\n""hoge"这样的东西,而导致结果不正确的原因可能是输入有误。 - MikeCAT
Wandbox上,对于相同和不同的字符串的响应似乎都是正确的。 - MikeCAT
2
@zackery.fix 为什么不直接使用strcmp(password.c_str(), id),而要加上无意义的转换呢? - MikeCAT
我一开始不确定,但是是的,在这里强制类型转换毫无意义。 - zackery.fix
显示剩余2条评论
2个回答

7

如 Matteo Italia 在另一个答案评论中提到的,可以像这样使用 std::string 的 operator==:

bool validatePassword(char id[], string password) {
    return password == id;
}

这个函数其实是不必要的,因为你的调用者应该直接调用operator==。


1
你可以通过将 id 转换为字符串并进行字符串比较来完成它:
string idStr(id);
if (password == idStr){

}

或者使用strcmp来比较两个字符数组:

if(strcmp (password.c_str(), id) == 0){

}

你需要使用方法c_str()将字符串转换为字符数组。

2
构造一个新的字符串只是为了进行比较是浪费的,而且这两种方法都是不必要地复杂,因为std::string已经提供了operator==的重载,可以将一个std::string与C字符串进行比较。 - Matteo Italia
@MatteoItalia,幸运的是,浪费是一些架构相关问题。你不能说构建一个新字符串来进行比较是浪费的。你有两个不同内部格式的值。真正的问题是你必须强制将一个格式更改为另一个格式才能进行比较。即使这在幕后自动完成,将char *转换为string以使用==运算符或者使用.c_str()方法从string中生成标准的char *。无论你选择哪种方法,你都不会知道哪种方法更有效,直到你知道目标架构。 - Luis Colorado
@MatteoItalia,仅仅说使用本地标准C++类型比使用旧的C类型更糟糕,这对于C++语言来说是太少了。你是否因为效率原因而使用旧的纯C结构编写所有C++代码?据我所知,“string”类也是出于效率原因而发明的。请不要在C++论坛中推荐使用C结构。 - Luis Colorado
2
请随意生活在幻想世界中,认为构造std::string是免费的(实际上不是;最近我不得不修复一个一直使用substr的解析器,这样做只会不必要地占用分配器,结果它变得快了5倍)。此外,就无缘由地使用C结构而言,我也同意,这就是我批评strcmp方法的原因。但是,这里的主要问题是两种解决方案都没有理由变得复杂,因为可以使用“==”将std::string与C字符串进行比较。 - Matteo Italia
第二个选项对我来说很好,谢谢。(我没尝试第一个) - Venryx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接