字符串库函数详解

字符串库函数详解(上)

一.strlen函数
strlen函数求字符串长度在这里插入代码片

#include<stdio.h>
#include<string.h>
int main(){
char str[1024]={0};
printf("请输入字符串:");
gets(str);
printf("%d\n",strlen(str));
return 0;

我们也可以自己实现strlen库函数

#include<stdio.h>
#include<assert.h>
size_t myStrlen(const char* str){
assert(str!=NULL);
size_t count=0;
while(*str!='\0'){
count++;
}
return count;
}
int main(){
char str[]="abcdef";
printf("%d\n",myStrlen(str));
return 0;
}

二.strcpy函数实现复制字符串

#include<stdio.h>
#include<string.h>
int main(){
char str1[1024];
char str2[]="abcdef";
printf("%s\n",strcpy(str1,str2));
return 0;
}

通过这段代码我们可以实现将字符串str2复制到str1上
那么如何自己通过代码来实现strcpy呢?

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* myStrcpy(char* dest,const char* src){
*char* ret=dest;
assert(dest!=NULL);
assert(src!=NULL);
while(*src){
*dest=*src;
src++;
dest++
}
return ret;
}
int main(){
char str1[1024]={0};
char str2[]="abcdef";
printf("%s\n",myStrcpy(str1,str2));
return 0;
}

此代码中的关键在于我们需要创建一个指针变量指向目的字符串,这样就可以做到中间变量保存字符串的效果。
除此之外我们还可以通过数组下标方式来操作。

#include<stdio.h>
#include<assert.h>
char* myStrcpy(char*dest,const char* src){
assert(dest!=NULL);
assert(src!=NULL);
int i=0;
while(src[i]!='\0'){
 dest[i]=src[i];
 i++;  
}
dest[i]='\0';
return dest;
}
int main(){
char str1[1024]={0};
char str2[]="abcdef";
printf("%s\n",myStrcpy(str1,str2));
return 0;
}

三.strcat 函数拼接字符串

#include<stdio.h>
#include<string.h>
int main(){
char str[80]={0};
strcat(str,"i ");
strcat(str,"am ");
strcat(str,"giggle.");
printf("%s\n",str);
return 0;
}

最终输出结果为i am giggle.
我们通过strcat实现将一个字符串拼接到另一个字符串后面
注意:我们要保证destination的字符串所占内存空间能保存你需要拼接在后的字符串
接下来我们通过一段代码来模拟实现strcat库函数

#include<stdio.h>
#include<assert.h>
char* myStrcat(char* dest,const char* src){
char* ret=dest;
assert(dest!=NULL);
assert(src!=NULL);
while(*dest){
dest++;
}
while(*dest++==*src){
src++;
}
return ret;
}
//方法二(数组下表处理)
//int desttail=0;
//while(dest[desttail]!='\0'){
//desttail++;
//}
//int i=0;
//while(src[i]!='\0'){
//dest[desttail+i]=src[i];
//i++;
//}
//dest[desttail+i]='\0';
//return dest;
int main(){
char str1[1024]="Happy ";
char str2[]="every day.";
printf("%s\n",myStrcat(str1,str2));
return 0;
}

四.strcmp函数

#include<stdio.h>
#include<string.h>
int main(){
char str1[]="hello";
char str2[]="hallo";
printf("%d\n",strcmp(str1,str2));
//最终输出结果为1
return 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("%d\n",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个,这样可能最终字符串缺少\0
最终可能导致程序崩溃

模拟实现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]!='\0'&&i<num){
dest[i]=src[i];
i++;
}
//上面有两种情况会触发循环结束
if(i==num){
return dest;
}
while(i<num){
dest[i]='\0';
i++;
}
return dest;
}
int main(){
char str1[1024]={0};
char str2[]="giggle";
printf("%s\n",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 not
strncat(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]!='\0'&&i<num){
dest[desttail+i]=src[i];
i++;
}
dest[desttail+i]='\0';
return dest;
}
int main(){
char str1[1024]="To be ";
char str2[]="or not to be";
printf("%s\n",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("%d\n",myStrcmp(str1,str2));
return 0;
}

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值