首页 > 编程知识 正文

字符串比较的库函数是什么,字符串比较函数strcmp

时间:2023-05-05 00:50:27 阅读:170920 作者:374

字符串库函数细节解(上)一. strlen函数

在此插入代码片段以确定strlen函数字符串的长度

# include stdio.h # include string.hint main () {char str[1024]={0}; printf ('请输入字符串:'); gets(str ); printf('%dn”,strlen ) ) str ); 返回0; 我们也可以自己实现strlen库函数

# include stdio.h # include assert.hsize _ tmy strlen (const char * str ) assert ) str!=空; size_t count=0; wile(*str!=' ' ) {count; }返回计数; }int main () {char str[]='abcdef '; printf('%dn”,mystrlen ) ) str ); 返回0; }2.使用strcpy函数实现复制字符串

# include stdio.h # include string.hint main () {char str1[1024]; char str2[]='abcdef '; printf(%s(n ),strcpy ) str2,str2); 返回0; }此代码可以将字符串str2复制到str1

那么如何自己用代码实现strcpy呢?

# include stdio.h # include stdlib.h # include assert.h char * my strcpy (char * dest,const char* src ) *char*ret=ddat=空; 资产(src )!=空; wile(*src ) ) {*dest=*src; src; dest }返回返回; (}int main ) ) charstr1(1024 )={0}; char str2[]='abcdef '; printf(%s(n ),mystrcpy ) str2,str2); 返回0; }在代码中,重要的是创建指针变量时必须指向目标字符串,中间变量才能实现保存字符串的效果。

除此之外,还可以使用数组下标方式进行操作。

# include stdio.h # include assert.h char * my strcpy (char * dest,const char* src ) assert ) dest!=空; 资产(src )!=空; int i=0; wile(src[I]!=' ' ) { dest[i]=src[i]; I; }dest[i]=' '; return dest; (}int main ) ) charstr1(1024 )={0}; char str2[]='abcdef '; printf(%s(n ),mystrcpy ) str2,str2); 返回0; }3.strcat函数将字符串连接起来

# include stdio.h # include string.hint main () charstr(80 )={0}; strcat(str,' I ' ); strcat(str,' am ); strcat(str,' giggle.' ); printf(%s(n ),str ); 返回0; }最终的输出结果为i am giggle。

使用strcat实现将一个字符串连接在另一个字符串之后

注意:我们要保证destination的字符串所占内存空间能保存你需要拼接在后的字符串

然后用代码模拟实现strcat库函数

# include stdio.h # include assert.h char * my strcat (char * dest,const char* src ) {char* ret=dest; 资产(dest!=空; 资产(src )!=空; wile(*{dest ) ) dest; }while(*dest==*src ) ) src; }return ret; //方法2 (数组下表处理)//int desttail=0; //while(dest[desttail]!=' ' ) {//desttail; //intI=0; //while(src[I]!=' ' ) {//dest[desttail i]=src[i]; //i; //dest[desttailI]=' ';//返回测试; int main () {char str1[1024]='Happy '; char str2[]='every day.'; printf(%s(n ),mystrcat ) str2,str2); 返回0; (四) strcmp函数

# include stdio.h # include string.hint main () {char str1[]='hell ) ) ) ) ) ) ) )。

o";char str2[]="hallo";printf("%dn",strcmp(str1,str2));//最终输出结果为1return 0;}

字符串比较大小按照字典序进行,谁靠前谁就较小。
比较结果返回值为正数,则表示前一个字符串大于后一个字符串
返回值为0则相同字符串,
返回值为负数则相反。
接下来通过代码来模拟实现strcmp库函数

#include<stdio.h>#include<assert.h>int myStrcmp(const char* str1,const char* str2){assert(str1!=NULL);assert(str2!=NULL);const char* p1=str1;const char* p2=str2;while(*p1&&*p2){if(*p1>*sp2){return 1;}else if(*p1<*p2){return -1;}else{p1++;p2++;}}if(*p1<*p2){return -1;}if(*p1>*p2){return 1;}else{return 0;}}int main(){char str1[]="hello";char str2[]="hallo";printf("%dn",myStrcmp(str1,str2));return 0;}

注意:在实际的库函数中输出结果只能确定是正负与零
五.strncpy函数
strncpy函数与strcpy函数的区别在于多了一个限制字符复制个数
我们应用此函数实现复制num个字符

#include<stdio.h>#include<string.h>int main(){char str1[1024]="hello";char str2[1024]="Hello";char str2[]="world";//比较strcpy和strncpy的区别strcpy(str1,str3);strncpy(str2,str3,sizeof(str3));return 0;}

注意:这相对于strcpy函数的弊端在于将字符串复制到目的地址中时可能会出现截断num个,这样可能最终字符串缺少
最终可能导致程序崩溃

模拟实现strncpy函数

#include<stdio.h>#include<assert.h>char* myStrncpy(char*dest,const char* src,size_t num){assert(dest!=NULL);assert(src!=NULL);assert(num!=0);size_t i=0;while(src[i]!=''&&i<num){dest[i]=src[i];i++;}//上面有两种情况会触发循环结束if(i==num){return dest;}while(i<num){dest[i]='';i++;}return dest;}int main(){char str1[1024]={0};char str2[]="giggle";printf("%sn",myStrncpy(str1,str2,sizeof(str2));return 0;}

五.strncat函数
这个和strncpy函数同理,它与strcat函数的区别就是拼接在后的字符数有限制。

#include<stdio.h>#include<string.h>int main(){char str1[1024]="To be ";char str2[]="or not to be";//这两个最终输出结果相同strcat(str1,str2);strncat(str1,str2,sizeof(str2));//最终结果为To be or notstrncat(str1,str2,6);//这时就只能拼接字符串中的前6个return 0;}

注意:指向目标数组的指针,该数组应包含一个C字符串,并且足够大以包含串联的结果字符串,包括附加的空字符。
模拟实现strncat函数

#include<stdio.h>#include<assert.h>char* myStrncat(char* dest,const char* src,size_t num){assert(dest!=Null);assert(src!=NULL);assert(num!=0);//利用数组下标更容易操作这种有数字限制的字符串size_t desttail=0;while(dest[desttail]){desttail++;}size_t i=0;while(src[i]!=''&&i<num){dest[desttail+i]=src[i];i++;}dest[desttail+i]='';return dest;}int main(){char str1[1024]="To be ";char str2[]="or not to be";printf("%sn",myStrncat(str1,str2,sizeof(str2));return 0;}

六.strncmp函数
比较两个字符串的前n个字符的大小关系
我们只需要简单模拟一下此函数,应用此函数的话与strncmp函数同理

#include<stdio.h>#include<assert.h>int myStrcmp(const char* str1,const char* str2,size_t num){assert(str1!=NULL);assert(str2!=NULL);const char* p1=str1;const char* p2=str2;size_t i=0;while(*p1&&*p2&&i<num){if(*p1>*p2){return 1;}else if(*p1<*p2){return -1;}else{i++;}}//有三种情况会触发循环结束if(*p1){return -1;}else if(*p2){return 1;}else{return 0;}}int main(){char str1[]="giggle";char str2[]="gaggle";printf("%dn",myStrcmp(str1,str2));return 0;}

总结:在模拟库函数实现时,首先重要的一点是校验参数的合法性,这是我们程序员思想的必备
在代码中我使用了assert断言,一旦触发程序就会崩溃,因此我们也可以使用if语句来代替
字符串函数的特点是我们可以通过指针来操作,也可以使用数组下标操作,在后面函数例如strncpy,strncat等函数中我们选择使用数组下标,这样方便我们控制字符个数。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。