一、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的判断