一、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
說明:
返回值:當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
用法:#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的判斷