库函数的分析与模拟(上)

在写代码的时候我们会经常处理一些字符或字符串,C语言又没有字符串类型,所以字符串通常存放在字符数组或者字符串常量,而后者适用于不进行更改的情况下,接下来我们探讨的是前者,那么进入我们今天的学习吧

一、函数

1.求字符串长度的函数

strlen

函数定义:size_t strlen ( const char * str );

返回值为:一个size_t类型的返回值,可以理解为unsigned int因为字符串长度不存在

负长度。

参数为:需要测量长度的字符串的首元素地址

所需要引用的头文件为:#include<string.h>

示例:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[]="abcdef";
    int len=strlen(arr);
    printf("字符串长度为:%d\n",len);
    return 0;
}
//字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )
  若在第二个元素就为'\0',则只计算到第二个元素
//参数指向的字符串必须要以 '\0' 结束
//注意函数的返回值为size_t,是无符号的

2.、长度不受限的字符串函数

  1. strcpy

函数定义:char*strcpy(char*strDestination,constchar*strSource);

函数返回值为:一个char*类型的指针,指向目标数组的地址即拷贝的目的数组

参数为:第一个参数为目标字符串的地址,第二参数为源字符串的地址,用指针接收

所需要引用的头文件:#include<string.h>

示例

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[20]="aaaaaaa";
    char arr2[]="hello";
    strcpy(arr1,arr2);                  //把arr2中的内容拷贝到arr1中
    return 0;
}
注意!!!!!!!
//源字符串必须以 '\0' 结束。在此例中为arr2数组
//会将源字符串中的 '\0' 拷贝到目标空间。
//目标空间必须足够大,以确保能存放源字符串。
//目标空间必须可变

  1. strcat

函数定义:char*strcat(char*strDestination,const char*strSource);

函数返回值为:char*类型的指针,指向目标字符数组

函数参数为:第一个参数为目标字符数组的地址,第二个参数为要连接字符的数组,用指针接收

所需要引用的头文件为:#include<string.h>

示例:

#incude<stdio.h>
#include<string.h>
int main()
{
    char arr1[20]="hello";
    char arr2[]="world";
    strcat(arr1,arr2);        //把 arr2 所指向的字符串追加到 arr1 所指向的字符串的结尾
    return 0;
}

//源字符串必须以 '\0' 结束。
//目标空间必须有足够的大,能容纳下源字符串的内容。
//目标空间必须可修改
这里思考一下如果arr1给自身进行追加会怎么样?
如果自己给自己追加将会出现问题,因为在进行追加时,自身的字符会被覆盖,那么就会出现'\0',被覆盖的情况,则函数无法遇上'\0',则会出现问题,建议画图理解一下更好哦

  1. strcmp

函数定义:int strcmp(const char*string1, const char*string2);

函数返回值为:整形 当string1小于string2时 返回<0的数

当string1等于string2时 返回值为0

当string1大于string2时 返回>0的数

函数参数为:第一个参数为被比较的字符串,第二个参数为进行比较的另一字符串,用指针接收

所需要引用的头文件为:#include<string.h>

示例:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[]="abcdef";
    char arr2[]="abcdef";
    strcmp(arr1,arr2);
    return 0;
}

strncpy

strncpy函数相比strcpy函数需要在列表的最后增加参数count且类型为size_t

char*strncpy(char*strDest,constchar*strSource,size_tcount);

示例:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[20]="aaaaaaa";
    char arr2[]="hello";
    strcpy(arr1,arr2,4);                  //把arr2中的4个字节内容拷贝到arr1中
    return 0;
}

strncmp

strncmp函数相比只需在参数列表的最后加上size_t count,表示需要比较的字符个数

char*strncpy(char*strDest, const char*strSource,size_t count);

示例:

#include<stdio.h>
#include<string.h>
int main()
{
    char s1[]="abcdef";
    char s2[]="abcdef";
    strcmp(arr1,arr2,4);
    return 0;
}eturn 0;
}
//进行比较,要比较的最大字符数
//用来比较s1和s2字符串的前n个字符。如果两个字符串相等的话,strncmp将返回0。如果s1是s2的一个子串的话,s1小于s2。

strncat

strncat函数相比strcat函数同样是在参数列表最后加上size_t类型的count表示从源字符串连接追加多少个字符到目标数组

char*strncat(char*strDest,constchar*strSource,size_tcount);

示例:

#incude<stdio.h>
#include<string.h>
int main()
{
    char arr1[20]="hello";
    char arr2[]="world";
    strcat(arr1,arr2,4);      //把 arr2 所指向字符串追加到 arr1 所指向的字符串的结尾,追加4个字符
    return 0;
}

strstr

strstr函数:多用于查找子串,即在str1字符串中查找str2字符串首次出现的位置

函数为:char*strstr(constchar*string,constchar*strCharSet);

函数返回值为:当存在str2在str1中出现的情况,则返回首次出现的位置,若不存在则返回NULL

函数参数为:第一个参数为被查找的字符串,第二个参数为查找的字符串,用指针接收使用,

所需头文件为:#include<string.h>

示例:

#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[]="eeeabcabc";
    char arr2[]="abc";
    char str=strstr(arr1,arr2);
    printf("%s",str);
    return 0;
}

strtok

strtok函数:用于分割字符串。

函数为:char*strtok(char*strToken,constchar*strDelimit);

函数返回值为:该函数返回被分解的第一个子字符串,如果没有可检索的字符串则返回一个空指针

函数参数为:第一个参数为要被分割的字符串,第二个参数用于分割的标识字符

所需头文件为:#include<string,h>

示例:

#include<stfio.h>
#include<string.h>
int main()
{
    char arr1[]="aaabcccdeee";
    char sep[]="bd";
    strtok(arr1,sep);
    printf("%s",arr1);
    return 0;
}
//第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
/*strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)*/
//strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
//strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记
//如果字符串中不存在更多的标记,则返回 NULL 指针

strerror

strerror函数:返回错误码所对应的信息

函数为:char*strerror(interrnum);

C 库函数 char *strerror(int errnum) 从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。strerror 生成的错误字符串取决于开发平台和编译器

memcpy

memcpy函数:将源数据的num个字节复制到目标内存位置上

函数为:void*memcpy(void*dest,constvoid*src,size_tcount);

函数返回值:返回值为需要的指针类型,注意此函数是针对字节级别的处理,所以参数是可以任意类型(自己做好设计需要使用什么样的数据)

函数参数:第一个参数是目标空间的地址,第二个参数为源数据的空间地址,第三个参数为需要拷贝的字节

函数需要头文件为:#include<memory.h>或#include<string.h>

示例:

#include <stdio.h>
#include <string.h>

struct 
{
    char name[40];
    int age;
} person, person_copy;

int main ()
{
    char myname[] = "zhangsan";
    //使用拷贝函数将myname字符串中的字符拷贝到person的成员neme中
    memcpy ( person.name, myname, strlen(myname)+1 );
    person.age = 46;
    //使用拷贝函数将person的数据拷贝到person_copy,因为字节拷贝所以不用担心类型,字节以及是最底层数了
    memcpy ( &person_copy, &person, sizeof(person) );
    printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );
    return 0
}
//注意本函数若是遇到源空间与目标空间重叠,这种情况是未定义的,也就是无法解决的

memove

memove函数:和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的

如果源空间和目标空间出现重叠,就得使用memmove函数处理

函数为:void*memmove(void*dest,constvoid*src,size_tcount);

函数返回值:同上

函数参数:同上

所需头文件:#include<string.h>

示例:

#include <stdio.h>
#include <string.h>
int main ()
{
    char str[] = "memmove can be very useful......";
    memmove (str+20,str+15,11);
    puts (str);
    return 0;
}

memcmp

memcmp函数为:字节级的比较函数,可以将两个空间内的数据进行字节级比较

函数为:intmemcmp(constvoid*buf1,constvoid*buf2,size_tcount);

函数返回值为:整形 当string1小于string2时 返回<0的数

当string1等于string2时 返回值为0

当string1大于string2时 返回>0的数

Memcmp 函数比较从buf1和buf2指针开始的num个字节节,并返回一个指示它们之间关系的值

函数参数为:第一和第二个参数是用于比较的空间地址,第三个参数为比较的字节数

所需头文件为:#include<string.h>

示例:

#include <stdio.h>
#include <string.h>
int main ()
{
    char buffer1[] = "DWgaOtP12df0";
    char buffer2[] = "DWGAOTP12DF0";
    int n;
    n=memcmp ( buffer1, buffer2, sizeof(buffer1) );
    if (n>0) 
        printf ("'%s' is 大于'%s'.\n",buffer1,buffer2);
    else if (n<0)
        printf ("'%s' is 小于 '%s'.\n",buffer1,buffer2);
    else 
        printf ("'%s' is 等于 '%s'.\n",buffer1,buffer2);
    return 0;
}

以上就是对部分库函数的学习,恭喜你看到了这里,为你的努力点赞!如果可的话希望一键三连哦^^

下一节我将会针对部分库函数进行模拟实现,依次来加深我们对库函数的理解,记得来学习哦

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值