C语言

一、strcmp和strncmp的编程实现及总结

   1、strcmp函数的实现
      要求:
         原型: int strcmp(char *dest,char * src,int n);    
           头文件:#include <string.h>
           功能:比较字符串s1和s2。
        说明:
               返回值:当s1<s2时,返回值<0
               返回值:当s1=s2时,返回值=0
               返回值:当s1>s2时,返回值>0
 
      mystrcmp代码实现:
 int mystrcmp(const char *dest,const char *src)
  {  
       int i=0;
   //判断str1与str2指针是否为NULL,函数assert的头文件为#include<assert.h>
     assert(dest!=NULL && src !=NULL);  //[1]    
 
    //如果dest > source,则返回值大于0,如果dest = source,则返回值等于0,如果dest  < source ,则返回值小于0。  
   while (*dest && *src && (*dest == *src)) 
   {    
     dest ++;  
     src ++; 
   }
   return *dest - *source; [2]
}

  注意:

    代码[1]:很多人会忘记对字符串指针的检查,这一部分能体现程序员的严谨性,主要体现在一下三点,

           a、不检查指针的有效性,说明答题者不注重代码的健壮性 

           b、检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识  

           c、检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处

        代码1类似于下述代码:  if ((strDest == NULL)||(strSrc == NULL))  return -1;  

              assert并不是抛出异常,而是判断是否出错
 

       代码[2]:为了优化代码,此代码中返回正数代表1,返回负数代表-1

  

    2、strncmp函数的实现
      要求:
          原型:extern int strcmp(char *s1,char * s2);    
          用法:#include <string.h>
             功能:比较字符串s1和s2的前n个字符。
             说明:
                 返回值:当s1<s2时,返回值<0
                 返回值:当s1=s2时,返回值=0
                 返回值:当s1>s2时,返回值>0 
 
     strncmp代码实现:
int strncmp(const char *s1, const char *s2, size_t  len)
{
   //判断str1与str2指针是否为NULL
     assert(s1!=NULL && s2 !=NULL);

    while(len--) 
   {
           if(*s1 == 0 || *s1 != *s2)
               return *s1 - *s2;
         
           s1++;
           s2++;
      }
      return 0;
}

    注意:注意事项同上,不过需要在上面的基础上添加一步 长度N的判断

原文地址:https://www.cnblogs.com/goul/p/9569550.html