strcmp函数

举报
悦来客栈的老板 发表于 2020/12/28 23:06:41 2020/12/28
【摘要】 #include <stdio.h>#include <assert.h> int strcmp(char const *str1, char const *str2){ int ret = 0; assert(str1 != NULL && str2 != NULL); while ( ! (ret = *(unsigned ch...

  
  1. #include <stdio.h>
  2. #include <assert.h>
  3. int strcmp(char const *str1, char const *str2)
  4. {
  5. int ret = 0;
  6. assert(str1 != NULL && str2 != NULL);
  7. while ( ! (ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str1)
  8. {//如果当前字符相等,且前面一个指针不为空,则指针后移;
  9. //判断指针是否为空是为了防止两个字串相等时的负作用
  10. str1++;
  11. str2++;
  12. }
  13. return ((ret>0)-(-ret>0));
  14. }
  15. int main()
  16. {
  17. char s[100];
  18. char p[100];
  19. gets(s);
  20. gets(p);
  21. if (strcmp(s,p) > 0)
  22. {
  23. printf("s is bigger than p\n");
  24. }
  25. else if (strcmp(s,p) < 0)
  26. {
  27. printf("s is smaller than p\n");
  28. }
  29. else
  30. {
  31. printf("s is equal to p\n");
  32. }
  33. return 0;
  34. }


 

//linux源码


  
  1. /**
  2. * strcmp - Compare two strings
  3. * @cs: One string
  4. * @ct: Another string
  5. */
  6. #undef strcmp
  7. int strcmp(const char *cs, const char *ct)
  8. {
  9. unsigned char c1, c2;
  10. while (1) {
  11. c1 = *cs++; //这里包含一个强制类型转换
  12. c2 = *ct++;
  13. if (c1 != c2)
  14. return c1 < c2 ? -1 : 1;
  15. if (!c1)
  16. break;
  17. }
  18. return 0;
  19. }


 


  
  1. /***
  2. *strcmp - compare two strings, returning less than, equal to, or greater than
  3. *
  4. *Purpose:
  5. * STRCMP compares two strings and returns an integer
  6. * to indicate whether the first is less than the second, the two are
  7. * equal, or whether the first is greater than the second.
  8. *
  9. * Comparison is done byte by byte on an UNSIGNED basis, which is to
  10. * say that Null (0) is less than any other character (1-255).
  11. *
  12. *Entry:
  13. * const char * src - string for left-hand side of comparison
  14. * const char * dst - string for right-hand side of comparison
  15. *
  16. *Exit:
  17. * returns -1 if src < dst
  18. * returns 0 if src == dst
  19. * returns +1 if src > dst
  20. *
  21. *Exceptions:
  22. *
  23. *******************************************************************************/
  24. int __cdecl strcmp (
  25. const char * src,
  26. const char * dst
  27. )
  28. {
  29. int ret = 0 ;
  30. while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst) //直到src和dst当前数值不相等且dst不为\0时退出while
  31. ++src, ++dst;
  32. if ( ret < 0 )
  33. ret = -1 ;
  34. else if ( ret > 0 )
  35. ret = 1 ;
  36. return( ret );
  37. }


 

 

//汇编源码


  
  1. int strcmp(const char *str1, const char *str2)
  2. {
  3. __asm //内联汇编开始
  4. {
  5. mov eax ,str1 //str1 是指针,在内嵌汇编中,会自动转成 " mov eax , dword ptr [str1] "
  6. mov ebx ,str2
  7. xor ecx, ecx
  8. _loop:
  9. push eax
  10. push ebx
  11. movsx eax ,[eax]
  12. movsx ebx ,[ebx]
  13. cmp eax ,ecx
  14. je eqends
  15. cmp eax , ebx
  16. jne neq
  17. pop ebx
  18. pop eax
  19. inc eax
  20. inc ebx
  21. jmp _loop
  22. eqends:
  23. cmp ecx ,ebx //也就是0与ebx比较
  24. jne neq
  25. jmp _eq
  26. neq:
  27. mov eax , 1
  28. jl small
  29. jmp exit
  30. small: neg eax
  31. jmp exit
  32. _eq:
  33. xor eax ,eax
  34. exit:
  35. add esp , 8
  36. }
  37. }


 

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/11890661

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。