阅读 ‧ 电子书库 说  明
由于任何非零值都为真,大多熟练的C程序员会把while语句简单地写为:
阅读 ‧ 电子书库

strcmp()函数的一个优点是它比较的是字符串,而不是数组。尽管数组try占用40个内存单元,而字符串“Grant”只占用6个内存单元(一个用来存放空字符),但是函数在比较时只看try的第一个空字符之前的部分。因此,strcmp()可以用来比较存放在不同大小数组里的字符串。

如果用户回答“GRANT”或“grant”或“Ulysses S. Grant”会怎么样呢?用户会被告知他或她是错的。要编出一个更友好的程序,您必须预先考虑到所有可能正确的答案。这里需要一些技巧。例如可以使用#define把答案定义为“GRANT”,然后编写一个函数,把所有的输入转换成大写字母。这样就解决了大小写的问题,但还是有其他需要考虑的形式。这一点我们留给读者自己练习。

strcmp()的返回值

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

如果字符串不相同,strcmp()返回什么值呢?程序清单11.18给出了一个例子。

程序清单11.18 compback.c程序

阅读 ‧ 电子书库

下面是一个系统上的输出结果:

阅读 ‧ 电子书库

比较“A”和它本身,返回值是0。比较“A”和“B”的返回值是-1;两者交换,再进行比较,返回值是1。这些结果说明如果第一个字符串在字母表中的顺序先于第二个字符串,则strcmp()函数返回的是负数;相反,返回的就是正数。因此,比较“C”和“A”得到的是1。其他系统可能返回的是2,即二者的ASCII编码值之差。ANSI标准规定,如果第一个字符串在字母表中的顺序先于第二个字符串,strcmp()返回一个负数;如果两个字符串相同,它返回0;如果第一个字符串在字母表中的顺序落后于第二个字符串,它返回一个正数。而确切的数值是依赖于不同的C实现的。例如,这里给出另一中实现下的输出结果,它在两个字符比较间返回不同的结果:

阅读 ‧ 电子书库

如果两个字符串中初始的字符相同会怎么样呢?一般来说,strcmp()函数一直往后查找,直到找到第一对不一致的字符。然后它就返回相应的值。例如,在上一个例子中,“apples”和“apple”只有最后一个字符(第一个字符串中最后的那个's')不同。匹配要进行到“apple”的第6个字符,即空字符(ASCII中的0) 。由于空字符在ASCII中排在第一个,字符s在它后面,因此函数返回一个正数。

上面的比较表明strcmp()比较所有的字符,而不仅仅是字母;因此我们不应称比较是按字母表顺序,而应该称strcmp()是按机器编码顺序(collating sequence)进行比较的。这意味着字符的比较是根据它们的数字表示法,一般是ASCII值。在ASCII中,大写字母先于小写字母。因此,strcmp(“Z”, “a”)是负数。

通常我们不会在意返回的确切值,只想知道结果为0还是非0(也就是说看看它们是否匹配);或者我们是把字符串按字母表顺序排序,希望知道比较结果是正数、负数还是0。