C++中string对象之间比较、char*之间比较

#include <cstring> //char* 使用strcmp
#include <string> //string 使用compare
#include <iostream>
using namespace std;
int main() {
    string stringStr1 = "42";
    string stringStr2 = "42";
    string stringStr3 = "213";
    cout << "stringStr1: " << stringStr1 << " " << "&stringStr1 :" << &stringStr1 << endl; // stringStr1: 42 &stringStr1 :0x648d3ff910
    cout << "stringStr2: " << stringStr2 << " " << "&stringStr2 :" << &stringStr2 << endl; // stringStr2: 42 &stringStr2 :0x648d3ff8f0
    cout << "stringStr3: " << stringStr3 << " " << "&stringStr3 :" << &stringStr3 << endl; // stringStr3: 213 &stringStr3 :0x648d3ff8d0

    //  string类对象,可以用"=="进行比较,值相等时表达式的值为1,不相等则为0
    bool stringStr1_stringStr2 = stringStr1 == stringStr2;
    cout << "stringStr1 == stringStr2: " << stringStr1_stringStr2 << endl; // stringStr1 == stringStr2: 1
    // 若两个string对象长度不同,而且较短的string对象的每个字符都与较长string对象对应位置上的字符相同,就说较短string对象小于较长string对象:
    // 若两个string对象在某些对应的位置上不一致,则string 对象比较的结果其实是string对象中第一对相异字符比较的结果:
    bool stringStr1_stringStr3 = stringStr1 > stringStr3;
    cout << "stringStr1 > stringStr3: " << stringStr1_stringStr3 << endl; // stringStr1 > stringStr3: 1
    // str1.compare(str2),如果返回值为0则表示两个字符串相等。 1表示>,2表示<;
    bool stringStr1_stringStr3_compare = stringStr1.compare(stringStr3);
    cout<<"stringStr1.compare(stringStr3): "<<stringStr1.compare(stringStr3)<<endl; // stringStr1.compare(stringStr3): 1

    cout<<"------------------------------------------------------------------"<<endl;

    char* charStr1 = "42";
    char* charStr2 = "42";
    char* charStr3 = "213";
    // (void*)charStr1表示"42"本身的地址
    cout << "charStr1: " << charStr1 << " " << "(void*)charStr1 :" << (void*)charStr1 << endl; // charStr1: 42 (void*)charStr1 :0x7ff623c55001
    cout << "charStr2: " << charStr2 << " " << "(void*)charStr2 :" << (void*)charStr2 << endl; // charStr2: 42 (void*)charStr2 :0x7ff623c55001
    cout << "charStr3: " << charStr3 << " " << "(void*)charStr3 :" << (void*)charStr3 << endl; // charStr3: 213 (void*)charStr3 :0x7ff623c55004
    // &charStr1表示指向"42"的指针的地址
    cout << "charStr1: " << charStr1 << " " << "&charStr1 :" << &charStr1 << endl; // charStr1: 42 &charStr1 :0x648d3ff8c8
    cout << "charStr2: " << charStr2 << " " << "&charStr2 :" << &charStr2 << endl; // charStr2: 42 &charStr2 :0x648d3ff8c0
    cout << "charStr3: " << charStr3 << " " << "&charStr3 :" << &charStr3 << endl; // charStr3: 213 &charStr3 :0x648d3ff8b8
    // charStr1和charStr2存的就是”42“第一个字符的地址
    cout << "charStr1: " << charStr1 << " " << "*charStr1 :" << *charStr1 << endl; // charStr1: 42 *charStr1 :4
    cout << "charStr2: " << charStr2 << " " << "*charStr2 :" << *charStr2 << endl; // charStr2: 42 *charStr2 :4
    cout << "charStr3: " << charStr3 << " " << "*charStr3 :" << *charStr3 << endl; // charStr3: 213 *charStr3 :2

    // "=="不能用于两个char类型字符串的比较,对于char类型字符串来说,"=="比较的是两个字符串的起始地址。相当于比较的(void*)charStr1 :0x7ff6a9d25001,是字符串本身的地址
    bool charStr1_charStr2 = charStr1 == charStr2;
    cout << "charStr1 == charStr2: " << charStr1_charStr2 << endl; // charStr1 == charStr2: 1,因为charStr1和charStr2都指向”42“,内容都是”42“的存储地址,所以相等,相当于地址之间的比较
    bool charStr2_charStr3 = *charStr2 == *charStr3;
    cout << "*charStr2 == *charStr3: " << charStr2_charStr3 << endl; // *charStr2 == *charStr3: 0
    // 比的是原字符串的地址,没有意思
    bool charStr1_charStr3 = charStr1 > charStr3;
    cout << "charStr1 > charStr3: " << charStr1_charStr3 << endl; // charStr1 > charStr3: 0
    // 跟string的比较方式类似,逐个字符进行比较
    bool charStr1_charStr3_strcmp = strcmp(charStr1,charStr3);
    cout << "strcmp(charStr1,charStr3): " << charStr1_charStr3_strcmp << endl; // strcmp(charStr1,charStr3): 1


    int a = "42" > "213";
    int b = strcmp("42" , "213"); //逐个字符比较
    cout<<"'42' > '213': "<<a<<endl;
    cout<<"strcmp(\"42\" , \"213\"): "<<b<<endl;
    return 0;
}
  • string对象之间直接用>或<进行比较是按照字符顺序逐个比较;
  • char*类型的字符串之间直接用>或<比较的话,比的只是地址,用strcmp()方法的话也是诸逐个字符进行比较。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值