b,差值为%d", ret1);else if (ret1 < 0) printf("a_strcmp strncmp">
当前位置:   article > 正文

字符串的比较?strcmp和strncmp_strcmp strncmp

strcmp strncmp

目录

字符的比较

字符串的比较

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函数

原理:

strcmp函数用于比较两个字符串的大小。从左向右逐个对照ASCⅡ值进行比较:

strcmp(str1,str2)

若str1 > str2,则返回值大于0

若str1 < str2,则返回值小于0

若str1 = str2,则返回值为0

  1. int strcmp (const char* str1, const char* str2)//函数原型
  2. //str1 和 str2 分别指向一个字符串,返回值是int类型

函数的使用:

自定义实现

先上代码:>

  1. #include <stdio.h>
  2. #include <string.h>
  3. int my_strcmp(const char* str1, const char* str2)
  4. {
  5. while (*str1 == *str2)
  6. {
  7. if (*str1 == '\0') return 0;
  8. str1++;
  9. str2++;
  10. }
  11. return *str1 - *str2;
  12. }
  13. int main()
  14. {
  15. char* a = "abcd";
  16. char* b = "adcd";
  17. int ret1 = my_strcmp(a, b);
  18. if (ret1 > 0) printf("a>b,差值为%d", ret1);
  19. else if (ret1 < 0) printf("a<b,差值为%d\n", -ret1);
  20. else printf("a==b");
  21. }

再讲过程:>

首先,确定函数的参数和返回类型

  1. int my_strcmp(const char* str1, const char* str2)
  2. {
  3. }

接着,进行实现

 由于只能返回1、0、-1,那么如果想要看到两个字符的差值呢?

那么只需要将return处改为二者相减即可:>

  1. int my_strcmp(const char* str1, const char* str2)
  2. {
  3. while (*str1 == *str2)
  4. {
  5. if (*str1 == '\0') return 0;
  6. str1++;
  7. str2++;
  8. }
  9. return *str1-*str2;
  10. }

库函数原型

自定义实现完,我们看看库函数的原型吧

  1. int __cdecl strcmp (
  2. const char * src,
  3. const char * dst
  4. )
  5. {
  6. int ret = 0 ;
  7. while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) == 0 && *dst)
  8. {
  9. ++src, ++dst;
  10. }
  11. return ((-ret<0))-(ret<0);
  12. }

源码解析

在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条件为真,进入循环,字符串向后走。


strncmp函数

 和strcmp相似,但是strncmp可以用于比较前n个字符,使得比较字符串更加灵活。

自定义实现

  1. int my_strncmp(const char*dest, const char* src, int n)
  2. {
  3. while ((--n) && (*dest == *src))
  4. {
  5. dest++;
  6. src++;
  7. }
  8. return *dest-*src;
  9. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/594323
推荐阅读
相关标签
  

闽ICP备14008679号