C语言中字符串之间的比较【char*】/【string】

本文详细介绍了C/C++中char*和string两种字符串类型的比较方法及其原理。对于char*,直接使用'>'、'<'、'=='比较实际上是对比指针地址,应使用strcmp()函数进行内容比较。而对于string类型,可以直接进行比较,因为它内部存储的是字符内容。此外,还提到了string类型的compare()函数用于更灵活的字符串比较,并介绍了两者之间的转换及比较方法。
摘要由CSDN通过智能技术生成

        在C/C++语言中表示字符串的方式有两种:

1、char* a   

2、string b 

 对于这两种方式各自之间比较又是怎么处理的呢?

        我们知道,数值直接进行比较,直接用'>'、'<'、'=='来判断。而对于一串字符这样比较对不对呢?

1、对于char*

首先定义几个字符串:    

    //test
    char* b = "acd";
    char* a = "abc";
    char* a1= "abc";    
    char* c = a;

①、如下比较,如果单从定义内容上看,结果是不是应该都会输出?

	if (a==a1)
	{
		cout<<"a=a1"<<endl;
	}
	if (a==c)
	{
		cout<<"a=c"<<endl;
	}

真正结果是仅输出了a=c 

②、再看下面a和b的比较,结果又是什么呢?单从内容上看‘acd’是不是大于‘abc’呢,即a<b?

	if (a>b)
	{
		cout<<"a>b"<<endl;
	}
	else if (a<b)
	{
		cout<<"a<b"<<endl;
	}
	else{
		cout<<"a=b"<<endl;
	}

最后结果是:a>b

        以上结果都怎么解释?来,我们看一下他们的内存空间就一切都明白了(主要还是要了解指针含义):

         我们不难发现,字符串使用'>'、'<'、'=='来比较最终比较的其实是他们指向的内存地址。b指向的内存地址0x34,小于a指向的内存地址0x84,即做比较发现a>b;而a赋值给c,那么c指向的内存地址也是0x84,故a=c;a1其实与a只是内容相同,但指向地址空间不同,直接‘==’其实他们不相等。

        那么正确的比较是怎么样的呢?

 是的,我们应该通过strcmp函数来比较char*型字符串的比较。

strcmp() 用来比较字符串(区分大小写),其原型为:

        int strcmp(const char *s1, const char *s2);

【参数】s1, s2 为需要比较的两个字符串。

字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。

【返回值】若参数s1 和s2 字符串相同则返回0。s1 若大于s2 则返回大于0 的值。s1 若小于s2 则返回小于0 的值。

注意:strcmp() 以二进制的方式进行比较,不会考虑多字节或宽字节字符;如果考虑到本地化的需求,请使用 strcoll() 函数。

另外,strcasecmp()函数也可用于判断字符串是否相等,但自动忽略大小写。strcasecmp()用来比较参数s1 和s2 字符串,比较时会自动忽略大小写的差异。

2、对于string

        string类型的字符串作比较则相对简单,首先定义一些字符串:

    string aa = a;
    string bb = "abc";
    string cc = "acd";

        其内存是:

 可见内部直接是存储的字符内容的。

那么直接比较会怎么样?

	if (aa > cc)
	{
		cout<<"aa > cc"<<endl;
	}
	else if (aa < cc)
	{
		cout<<"aa < cc"<<endl;
	} 
	else
	{
		cout<<"aa = cc"<<endl;
	}

结果是:aa<cc。是正确的呀,说明string类型的字符串是可以拿来直接比较的。

当然在查找过程中也发现string类型的字符串比较还可以用compare()函数来进行。

compare()函数重载较多,其用例主要有:

1、int n = aa.compare(cc);

2、int n = aa.compare(1,2,cc);// 1代表aa的下标,2代表数量 意思为 aa字符串中下标为1开始 字符数量为2的字符串‘bc’与cc相比;

3、int n = aa.compare(1,2,cc,0,2);//意思为 aa字符串中下标为1开始 字符数量为2的字符串‘bc’与cc字符串中下标为0开始 字符数量为2的字符串‘ac’相比;

n=0表示比较的字符串相等,n>0表示aa'大于cc',n<0表示aa'小于cc'。

3、char*和string两者是可以相互转换的,为此在比较前重新定义对应变量并赋值即可,然后使用自己熟悉的比较方法进行比较就行了。

两者转换方法则可以参考:C++中string、char *、char[]之间数据类型相互转换方法_nanke_yh的博客-CSDN博客icon-default.png?t=LA92https://blog.csdn.net/nanke_yh/article/details/102769546

  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanke_yh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值