b,差值为%d", ret1);else if (ret1 < 0) printf("a_strcmp strncmp">
赞
踩
目录
为什么会有字符串比较函数?
字符串为啥不能直接比较啊?
以ASCII码值的大小作为字符比较的标准,如果某一个字符的ASCII码值的大于另一字符的ASCII码,则认为前一字符“大于”后一字符,如“C”大于“A”,“A"小于"B"
字符大小可以用下表由小到大排列:
空格! ” # $ % & ’ (
) * + , 一 .0 1 2 3
4 5 6 7 8 9 : ; <=
> ? @ A B C D E F G
H I J K L M N O P Q
R S T U V W X Y Z
[ \ ] ^ _ ' a b c d e f......
两个字符串比较,是将这两个字符串从左到右逐个字符比较:
1、如果两个字符串长度相等,且每一个相应位置上的字符都一样,就认为两个字符串相等,如: “hello”=“hello”。
2、如果两个字符串长度不相等,则以第一个不相同的字符作为基准,而不考虑他们的长度及其后字符的比较结果。如: "he" > "haaaa"
3、如果两个字符串长度不相等,且所有相应位置上的字符都一样,则长者为大。
如: “hello”>“hell”
注意:
1、当字符串有空格时,空格也参加比较。
2、字母大小写不同,ASCII代码值也不同。
3、由汉字组成的字符串也可以比较。
如:”张三” > ”李四” 实际比较内容是:zhangsan ,lisi
4、不是哪个字符串更长就更大,而是碰到第一个不同的字符之后,就返回结果。
字符串的比较,比较的是首元素的地址。而地址是未知的,所以结果也无法预知。
所以,我们需要用到两个库函数来进行字符串的比较。
原理:
strcmp函数用于比较两个字符串的大小。从左向右逐个对照ASCⅡ值进行比较:
strcmp(str1,str2)
若str1 > str2,则返回值大于0
若str1 < str2,则返回值小于0
若str1 = str2,则返回值为0
- int strcmp (const char* str1, const char* str2)//函数原型
- //str1 和 str2 分别指向一个字符串,返回值是int类型
函数的使用:
先上代码:>
- #include <stdio.h>
- #include <string.h>
- int my_strcmp(const char* str1, const char* str2)
- {
- while (*str1 == *str2)
- {
- if (*str1 == '\0') return 0;
- str1++;
- str2++;
- }
- return *str1 - *str2;
- }
-
- int main()
- {
- char* a = "abcd";
- char* b = "adcd";
- int ret1 = my_strcmp(a, b);
- if (ret1 > 0) printf("a>b,差值为%d", ret1);
- else if (ret1 < 0) printf("a<b,差值为%d\n", -ret1);
- else printf("a==b");
- }
再讲过程:>
首先,确定函数的参数和返回类型
- int my_strcmp(const char* str1, const char* str2)
- {
-
- }
接着,进行实现
由于只能返回1、0、-1,那么如果想要看到两个字符的差值呢?
那么只需要将return处改为二者相减即可:>
- int my_strcmp(const char* str1, const char* str2)
- {
- while (*str1 == *str2)
- {
- if (*str1 == '\0') return 0;
- str1++;
- str2++;
- }
- return *str1-*str2;
- }
自定义实现完,我们看看库函数的原型吧
- int __cdecl strcmp (
- const char * src,
- const char * dst
- )
- {
- int ret = 0 ;
-
- while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) == 0 && *dst)
- {
- ++src, ++dst;
- }
- return ((-ret<0))-(ret<0);
- }
在while循环中的判断条件:
1、return 中有两个表达式(-ret<0)与(ret<0)表达式结果只有1和0
所以,最后返回值只有1、0、-1
2、首先,令ret等于两个字符相减,如果ret==0 && 字符串此时来到\0
那么&&的判断为真,前面有!(非),所以while条件为假,直接进入return
由于ret=0,所以两个表达式结果都为0,相减为0,最终就会返回0
3、如果ret != 0 && 字符串没有来到\0
那么判断条件为真,!作用之后为假。while条件为假,跳出while循环,进入return
4、如果ret==0但是字符串没有来到\0,那么&&条件为假,!之后为真,while条件为真,进入循环,字符串向后走。
和strcmp相似,但是strncmp可以用于比较前n个字符,使得比较字符串更加灵活。
- int my_strncmp(const char*dest, const char* src, int n)
- {
- while ((--n) && (*dest == *src))
- {
- dest++;
- src++;
- }
- return *dest-*src;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。