C语言进阶——字符串与内存函数

目录

一、求字符串长度:strlen

二、长度不受限制的字符串函数

1、字符串复制函数strcpy

2、字符串追加函数strcat

3、字符串比较函数strcmp

三、长度受限制的字符函数

1、字符串复制函数strncpy

2、字符串追加函数strncat

3、字符串比较函数strncmp

四、字符串查找

1、strstr

2、strtok

五、错误信息报告:strerror

六、字符操作函数

1、字符分类函数

 2、字符转换函数

七、内存操作函数

1、memcpy

2、memmove

3、memset

4、memcmp


一、求字符串长度:strlen

语法: size_t strlen(const char* str);

●strlen函数返回的是字符'\0'前面出现的字符个数

●参数指向的字符串必须要以'\0'结束

●函数的返回值为size_t,是无符号整型

//模拟实现strlen函数
int my_strlen(const char* str)
{
    assert(str!=NULL);
    while(*str!='\0')
    {
       count++;
       str++;
    }
    return count;
}

二、长度不受限制的字符串函数

1、字符串复制函数strcpy

语法:char* strcpy(char* destination,const char* source);

●源字符串必须以'\0'结束

●目标空间必须足够大,以确保能存放字符串

●目标空间必须可变

2、字符串追加函数strcat

语法:char* strcat(char* destination,const char* source);

●源字符串必须以'\0'结束

●目标空间必须足够大,能容纳下源字符串的内容

●目标空间必须可修改

●无法自己追加自己,因为\0被覆盖了,永远无法结束。

//模拟实现strcat函数
char* my_strcat(char* dest,const char* src)
{
    char* ret=dest;
    assert(dest&&src);
    //找到目标字符串的\0
    while(*dest)
    {
         dest++;
    }
    //追加
    while(*dest++=*src++;)
    {
       ;
    }
    return ret;
}

3、字符串比较函数strcmp

语法:int strcmp(const char* str1,const char* str2);

●标准规定:

第一个字符串大于第二个字符串,则返回大于0的数字;第一个字符串等于第二个字符串,则返回0;第一个字符串小于第二个字符串,则返回小于0的数字。

//1
int my_strcmp(const char* s1,const char* s2)
{
    assert(s1&&s2);
    while(*s1==*s2)
    {
        if(*s1=='\0')
        {
            return 0;
        }
        s1++;
        s2++;
    }
    if(*s1>*s2)  
    {
       return 1;
    }
    else
    {
       return -1;
    }
}
//2
int my_strcmp(const char* s1,const char* s2)
{
    assert(s1&&s2);
    while(*s1==*s2)
    {
        if(*s1=='\0')
        {
            return 0;
        }
        s1++;
        s2++;
    }
    return *s1-*s2;
}

三、长度受限制的字符函数

1、字符串复制函数strncpy

语法:char* strncpy(char* destination,const char* source,size_t num);

2、字符串追加函数strncat

语法:char* strncat(char* destination,const char* source,size_t num);

3、字符串比较函数strncmp

语法:char* strncmp(char* destination,const char* source,size_t num);

四、字符串查找

1、strstr

语法:char* strstr(const char* str1,const char* str2);

作用:在一个字符串中找另外一个字符串,返回第一次出现的位置或者null指针

int my_strstr(const char* str1,const char* str2)
{
    assert(str1&&str2);
    const char* s1=NULL;
    const char* s2=NULL;
    char* cp=str1;
    if(*str2=='\0') 
    {
       return (char*)str1;
    }
    while(*cp)
    {
        s1=cp;
        s2=str2;
        while(*s1 && *s2 && (*s1==*s2))
        {
            s1++;
            s2++;
        }
        if(*s2=='\0')
        {
           return (char*)cp;
        }
        cp++;
    }
    return NULL;
}

2、strtok

语法:char* strtok(char* str,const char* sep);

作用:用来切割字符串

●sep参数是个字符串,定义了用作分隔符的字符集合

●第一个参数指定了一个字符串,它包含了0个或多个由sep字符串中一个或多个分隔符分割的标记

●strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针

●strtok函数会改变被操作的字符串,因此在使用strtok函数切分字符串一般都是临时拷贝的内容,并且可修改

●strtok函数中的第一个参数不为NULL时,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置;strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记

●如果字符串中不存在更多的标记,则返回NULL指针

int main()
{
    char arr[]="abc@qq.com";
    char *p="@.";
    char tmp[20]={0};
    strcpy(tmp,arr);
    char* ret=NULL;
    for(ret=strtok(tmp,p);ret!=NULL;ret=strtok(NULL,p))
    {
        printf("%s\n",ret);
    }
    return 0;
}

五、错误信息报告:strerror

语法:char* strerror(int errnum);

作用:返回错误码,所对应的错误消息

要求:必须包含头文件#include<errno.h>

int main()
{
    printf("%s\n",strerror(0));  //No error
    printf("%s\n",strerror(1));  //Operation not permitted
    printf("%s\n",strerror(2));  //No such file or directory
    printf("%s\n",strerror(3));  //No such process
    printf("%s\n",strerror(4));  //Interrupted function call
    printf("%s\n",strerror(5));  //Input/output error
    return 0;
}

六、字符操作函数

1、字符分类函数

函数如果函数参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格''、换页符'\f'、换行'\n'、回车'\r'、制表符'\t'或垂直制表符'\v'
isdigit十进制数字0-9
isxdigit十六进制数字,包括所有的十进制数字、小写字母a-f、大写字母A-F
islower小写字母a-f
isupper大写字母A-F
isalpha字母a-z或A-Z
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgragh任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

 2、字符转换函数

int tolower(int c);

int toupper(int c);

七、内存操作函数

1、memcpy

语法:void* memcpy(void* destination,const void* source,size_t num);

作用:可以拷贝不重叠的内存

//例
int main()
{
    int arr1[10]={1,2,3,4,5,6,7,8,9,10};
    int arr2[10]={0};
    memcpy(arr2,arr1,20);//拷贝5个数
    return 0;
}

//模拟实现memcpy函数
void* my_memcpy(void* dest,const void* src,int num)
{
    assert(dest&&src);
    while(num--)
    {
       *(char*)dest=*(char*)src;
       dest=(char*)dest+1;
       src=(char*)src+1;
    }
    return ret;
}

2、memmove

语法:void* memmove(void* destination,const void* source,size_t num)

作用:拷贝,可以处理内存重叠的情况

void* my_memmove(void* dest,const void* src,size_t num)
{
     void* ret=dest;
     assert(dest&&src);
     if(dest<src)
     {
        while(num--)
        {
            *(char*)dest=*(char*)src;
            dest=(char*)dest+1;
            src=(char*)src+1;
        }
     }
     else
     {
        while(num--)
        {
            *((char*)dest+num)=*((char*)src+num);
        }
     }
     return ret;
}

3、memset

语法:void* memset(void* ptr,int value,size_t num)

作用:把ptr指向空间的前num个字节内容设置成value值

4、memcmp

内存比较函数

语法:int memcmp(const void* ptr1,const void* ptr2,size_t num),比较前num个字节

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趣多多代言人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值