10.2.3 字符串函数strcmp

strcmp函数,cmp即compare,它是用来比较两个字符串的.

因为这两个字符串是用来比较的,所以它们当然是const,因为在比较的过程中是不可能去修改这两个字符串的.但它比较的结果不仅仅是用来说这两个字符串是否相等,它还可以表现出这两个字符串谁大谁小.那大和小到底是怎么定义的呢?我们来试一下:

结果为0,表示这两个字符串相等.这点不舒服的地方是不能用来作为if的条件.

那我们可不可以拿两个数组来比较他们相不相等呢.不可以.编译器会给我们一个warning,它说数组的比较永远都是false.为什么,因为这两个数组一定不会是相同的地址,当我们用像s1==s2比较这两个数组,它表达的是他们是否是相同的地址,所以肯定不行.

我们把第二个字符串改成bbc.结果是-1.表明s1比s2小.如果改为Abc,这个时候的结果就是1,表明s1比s2大.那如果我们再改一下,把s2改成abc (有空格).结果是-1.它告诉我们第二个比第一个更大.其实这相当于拿\0的ascii码值减去空格的ASCII码值,得到-32,即s1小于s2,最后返回-1.(有些编译器会返回两者ASCII码的差值)

我们来写一下自己的mycmp:

意思是我们拿这两个数组对应的单元进行比较,通过++一直比较下去,如果什么时候不相等了就break,否则当s1(或s2也可以,不用特地去比较哪个大哪个小,反而更费时间)的最后一个字符为0就break.

我们做一下改进:

我们省去了if else,直接把它们放到循环条件那里做判断,然后循环体只有idx++让两个数组单元一直往后走.

我们还能再继续优化吗?当然可以:

我们省去了对idx的定义,直接让指向这两个字符串的指针边往后走边对比.

后面这两种写法执行效率谁高谁低很难说.最后的执行效率很大程度上编译器会帮你做优化的.你无论写成那种样子,编译器最后产生的代码可能是差不多的.ps:个人感觉最后一个更elegant.

(注意!这三段代码返回的都是这两个字符串的差值.)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值