【C语言】详讲库函数的使用

  1. 常用的字符串库函数

  • Strtok函数:

//strtok库函数
//strtok函数是C语言自带的库函数
//strtok函数是用于获取分割符号前的字符串函数
//如:abc@de.f
//第一次调用我们时,我们可以将目标数组里的元素临时拷贝到
//另一个数组里进行操作,第一次传参为(目标数组,数组里的符号)
//当碰到第一个符号时将该符号改为'\0',则返回符号前字符串首元素地址
//当第二次调用时,我们只需将目标数组变为空指针即可,
//开始寻找下一个符号前的字符串
//当再次调用函数时,往后找不到符号时返回NULL
#include<string.h>
int main()
{
    char arr1[] = "abc@de.f";
    char buf[30] = { 0 };
    strcpy(buf, arr1);
    char* p = "@.";
    char *str = strtok(buf, p);
    printf("%s\n", str);
    str = strtok(NULL, p);
    printf("%s\n", str);
    str = strtok(NULL, p);
    printf("%s\n", str);
    return 0;
}

  • Strerror函数

//Strerror函数
//Strerror函数是C语言自带的库函数
//用于处理字符串的错误信息
//其构造为:char* strerror(int errnum)
//C语言的库函数在调用失败的时候,会将一个错误码存放在一个
//叫:errno的变量中,当我们想知道调用库函数的时候发生了什么错误信息
//,就可以将:errno中的错误码翻译成错误信息
//调用该函数会返回错误信息的首元素地址
#include<errno.h>//使用该库函数需包含此头文件
int main()
{
    //使用指针来接受返回的首元素地址
    //char*p = strerror(0);
    //printf("%s\n", p);

    //p = strerror(1);
    //printf("%s\n", p);

    //p = strerror(2);
    //printf("%s\n", p);

    //p = strerror(3);
    //printf("%s\n", p);


    //下面举个例子
    //打开文件
    // 如果文件打开方式是"r"
    // 文件存在打开成功,文件不存在打开失败
    //打开文件失败会返回空指针
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        printf("打开文件失败,原因是:%s\n", strerror(errno));
        return 1;
    }
    //读写文件
    //......
    //关闭文件
    fclose(pf);
    return 0;
}

我们并没有这个文件,因此用strerror库函数返回错误信息,根据错误信息

让我们知道失败原因


  • 字符分类函数


  • Strlen函数

//Strlen函数
//用于求字符串元素个数
//计算'\0'之前的元素个数
//其构造为:int strlen(const char*要求的字符串首元素地址)
//使用该函数需包含string.h头文件
//注意:返回一个无符号整型
#include<stdio.h>
#include<string.h>
int main()
{
    char p[] = "abcdef";
    size_t ret = strlen(p);
    printf("%d\n", ret);
    return 0;
}

  • Strcpy函数

//Strcpy函数
//用于拷贝字符串到另一空间内(连带'\0')
//其构造为:char* strcpy(char* 目标空间,const char* 源头)
//最终会返回目标空间的首元素地址
// 注意:目标空间必须比源头空间大
//包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[] = "abcdef";
    char arr2[20] = "abcdefg";
    char* p = strcpy(arr2, arr1);
    printf("%s\n", p);

    return 0;
}

  • Strcmp函数

//Strcmp函数
//用于两个字符串之间的比较
//当字符串1>字符串2时,将返回>0的数字
//当字符串1<字符串2时,将返回<0的数字
//当字符串1=字符串2时,将返回=0的数字
//其构造为:int strcmp(const char*字符串1首元素地址,const char*字符串2首元素地址)
// 内部原理为:从第一个元素依次比较,当发现有>或<的情况时则返回,当全部元素相等时才返回0
//需包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
    char p1[] = "abcdef";
    char p2[] = "abcdel";
    int ret = strcmp(p1, p2);
    printf("%d\n", ret);
    return 0;
}

  • Strcat函数

//Strcat函数
//用于字符串的接续,当我们想将字符串1连接到字符串2的后面时,我们可使用该函数实现
//其构造:char* strcat(char* 目标字符串,const char* 接续字符串)
//原理:将接续字符串包括'\0'连接到目标字符串'\0'的位置依次往后
//最终返回目标字符串的首元素地址
//使用需包含string.h头文件
//注意:目标字符串的空间需要足够大,能够存放接续字符串所以元素
#include<stdio.h>
#include<string.h>
int main()
{
    char p1[] = "abcdef";
    char p2[20] = "abcdef";
    char* p = strcat(p2, p1);
    printf("%s\n", p);
    return 0;
}

  • Strncpy函数

//Strncpy函数
//用于指定几个字符拷贝到另一空间内
//其构造为:char* strcpy(char* 目标空间,const char* 源头,size_t num(数量))
//最终会返回目标空间的首元素地址
// 注意:    1.目标空间必须比源头空间大
//            2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
//包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
    char arr1[] = "cdef";
    char arr2[20] = "abcdef";
    char* p = strncpy(arr2, arr1,2);
    printf("%s\n", arr2);

    return 0;
}

  • Strncmp函数

//Strncmp函数
//用于指定几个字符进行的比较
//当字符串1>字符串2时,将返回>0的数字
//当字符串1<字符串2时,将返回<0的数字
//当字符串1=字符串2时,将返回=0的数字
//其构造为:int strcmp(const char*字符串1首元素地址,const char*字符串2首元素地址,size_t num(数字))
// 内部原理为:从第一个元素依次比较,当发现有>或<的情况时则返回,当全部元素相等时才返回0
//需包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
    char p1[] = "abcdgf";
    char p2[] = "abcdel";
    int ret = strncmp(p1, p2,5);
    printf("%d\n", ret);
    return 0;
}

  • Strcat函数

//Strncat函数
//用于指定数量字符串的追加,当我们想指定num个字符连接到字符串2的后面时,我们可使用该函数实现
//其构造:char* strcat(char* 目标字符串,const char* 追加字符串,size_t num(数量))
// 无论追加几个字符,最后都会自动补'\0'
//最终返回目标字符串的首元素地址
//使用需包含string.h头文件
//注意:目标字符串的空间需要足够大,能够存放接续字符串所以元素
#include<stdio.h>
#include<string.h>
int main()
{
    char p1[] = "abcdef";
    char p2[20] = "abcdef";
    char* p = strncat(p2, p1,3);
    printf("%s\n", p);
    return 0;
}

  • Strstr函数

//Strstr函数
//用于寻找字符串元素中第一次出现的字符串
//其构成为:char* strstr(const char* 总字符串,const char* 想寻找的字符串)
//最终返回第一次出现该字符串的首元素地址
//需包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
    char p[] = "abcdefgh";
    char e[] = "efgh";
    char* k = strstr(p, e);
    printf("%s\n", k);
    return 0;
}

  1. mem系列库函数

  • memcpy函数

//memcpy函数
//用于任意类型元素拷贝
//其构造为:void* memcpy(void* 目标空间,const void* 源头,size_t num(字节个数))
//注意:1.该函数并不是以遇到'\0'为停止标志
//     2.如果目标空间和源头有任何的重叠,复制的结果都是未定义的。
//需包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
    int arr[] = { 1,2,3,4,5 };
    int arr1[10] = { 5,4,3,2,1 };
    int* p = memcpy(arr1, arr, 20);
    int i = 0;
    for (i = 0; i < sizeof(arr1)/sizeof(arr1[0]); i++)
    {
        printf("%d ", *(p + i));
    }
    return 0;
}

  • memmove函数

//memmove函数
// 与memcpy功能相似
// 区别在于:memmove可以拷贝位置重叠的情况
//            如果源空间和目标空间出现重叠,就得使用memmove函数处理。
//            (列如我们想拷贝源头字符串的情况)
//用于任意类型元素拷贝
//其构造为:void* memcpy(void* 目标空间,const void* 源头,size_t num(字节个数))
//memmove>memcpy,memmove包含了memcpy
//需包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
    int arr[10] = { 1,2,3,4,5 };
    int* p = memmove(arr+2, arr, 8);
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

  • memcmp函数

//memcmp函数
//用于任意类型元素比较
//其构造为:int memcmp(const void* 比较1,const void* 比较2,size_t sz(比较的字节个数))
//>返回>0的数
//<返回<0的数
//=返回=0的数
//包含string.h头文件
#include<stdio.h>
#include<string.h>
int main()
{
    int p1[] = { 1,3,5,7,9 };
    int p2[] = { 2,4,6,8,10 };
    int ret = memcmp(p1, p2, 12);
    printf("%d\n", ret);
    return 0;
}

  • memset函数

//memset函数
//用于修改指定字节个数元素的值
//其构造为:void* memset(void* 目标,修改内容,size_t num(字节个数))
//注意:该函数是根据字节个数来进行修改的
//        会有特殊情况:看一下代码
#include<stdio.h>
#include<string.h>
int main()
{
    char p[] = "hello world!";
    char* k = memset(p, 'p', 4);
    printf("%s\n", k);
    return 0;
}

使用该函数做不到将p数组里的值全改为1,因为该函数修改方式是按照字节执行的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值