字符函数和字符串函数

目录

  1. strlen

  1. strcpy

  1. stcat

  1. strstr

  1. strcmp

前言:大家好,本章主要分享的是了解、使用、模拟实现以上字符函数和字符串函数

  1. strlen

计算字符串的长度

size_t strlen(const char* str);
size_t//返回的是无符号整数
char*str//接受的是要计算字符串的首字符的地址,const修饰保证字符串不被修改

注意:1、字符串要以‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包含‘\0’)。

  1. 参数指向的字符串必须要以‘\0’结束。

  1. 注意函数的返回值为size_t,是无符号的整数。(易错)

  1. 学会strlen函数的模拟实现。

先看看是如何使用的

#include<stdio.h>
#include<string.h>
int main()
{
    char ch[] = "abcdef";
    int ret = strlen(ch);
    printf("%d\n", ret);
}

因为字符串中‘\0’之前字符有6个,所以返回的是6。

接下来在通过模拟实现看看

#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
    assert(str);
    size_t count = 0;
    while (*str++)
    {
        count++;
    }
    return count;
}
int main()
{
    char ch[] = "abcdef";
    size_t ret = my_strlen(ch);
    printf("%u\n", ret);
    return 0;
}

注意:1.const修饰指针为了保证指针不被修改。

2.assert是断言,保证指针的有效性。(后面类似,不再解释)

3.要的头文件都是string.h

2、strcpy

拷贝字符串

char* strcpy(char* destination, const char* source)
char*//返回的是目标字符串的首元素地址
char* destination//目标字符串的起始地址
char*source//来源字符串的起始地址

注意:1、原子符串必须要以‘\0’结束。

2、会将字符串中的‘\0’拷贝到目标空间。

3、目标空间必须足够大,以确保存放原子符串。

4、目标空间必须可变

5、学会模拟实现

先看看使用

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

注意:目标空间的必须足够大,这是写代码的我们必须知道的

再来看看如何实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
    assert(dest && src);
    char* ret = dest;
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char ch1[] = "abcdef";
    char ch2[] = "#################";
    printf("%s\n", my_strcpy(ch2, ch1));
    return 0;

3、strcat

追加字符串

char* strcat(char* destination, const char* source);
char*//返回的是目标字符串的起始地址
char*destination//目标字符串的起始地址
char*source//源字符串的起始地址

注意:1、源字符串必须以‘\0’结束。

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

3、目标空间必须可修改。

先来看看使用

#include<stdio.h>
#include<string.h>
int main()
{
    char ch1[20] = "abc";
    char ch2[] = "defg";
    strcat(ch1, ch2);
    printf("%s\n", ch1);
    return 0;
}

接下来看看模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
    assert(dest && src);
    char* ret = dest;
    while(*dest)
    {
        dest++;
    }
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char ch1[20] = "abc";
    char ch2[] = "defg";
    
    printf("%s\n", my_strcat(ch1, ch2));
    return 0;
}

注意:这个模拟实现,追加两个不同字符串的时候是可行的,不过当你自己给自己追加的时候,就会无限循环下去。

那要怎么自己给自己追加呢?

那就要请出我们的strncat。(这既然是一个问句,就留给你们回答吧)

4、strstr

在一个字符串中查找另一个字符串

const char* strstr(const char* str1, const char* str2);
char*//如果str1中有字符str2,则返回str1中出现str2首字符地址,找不到返回空指针
char*str1//被查找的字符串的首字符地址
char*str2//要查找字符串的首字符地址

那看看怎么使用吧

#include<stdio.h>
#include<string.h>
int main()
{
    char ch1[] = "abcdefg";
    char ch2[] = "abcq";
    char* p1=strstr(ch1, ch2);
    if(p1!=NULL)
    printf("找到了为:%s\n", p1);
    else
    {
        printf("找不到\n");
    }
    return 0;
}

这个函数实现起来有点小复杂,不过还是可以实现的。

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strstr( char* str1,  char* str2)
{
    assert(str1 && str2);
    //引入两个指针,记住一个地址,防止找不到下一个要遍历的地址
    char* pa = str1;
    char* pc = NULL;

    while (*pa)
    {
        pa = str1;
        pc = str2;
        while (pa && pc && *pa == *pc)
        {
            pa++;
            pc++;
        }
        if (*pc == '\0')//说明已经找完str2的字符并找到了
        {
            return str1;
        }
        str1++;
    }
    return NULL;
}
int main()
{
    char ch1[] = "abcdefg";
    char ch2[] = "abc";
    char* p1=my_strstr(ch1, ch2);
    if(p1!=NULL)
    printf("找到了为:%s\n", p1);
    else
    {
        printf("找不到\n");
    }
    return 0;
}

5、strcmp

字符串的比较

int strcmp(const char* str1, const char* str2);
int//如果str1字符串比str2字符串大返回大于0的数,比它小返回小于0的数,相等返回0
char*str1//第一个要比较的字符串的首元素地址
char*str2//第二个要比较的字符串的首元素地址

注意:1、第一的字符串大于第二个字符串,则返回大于0的数字(在VS中返回1,其他编译器不一定)

2、第一的字符串等于第二个字符串,则返回0

3、第一个字符串小于第二个字符串,则返回小于0的数字(在VS中返回-1)

函数的使用

#include<stdio.h>
#include<string.h>
int main()
{
    char ch1[] = "abcdef";
    char ch2[] = "abcq";
    int ret = strcmp(ch1, ch2);
    printf("%d\n", ret);
    return 0;
}

函数的模拟实现

#include<stdio.h>
#include<string.h>
int my_strcmp(const char* str1, const char* str2)
{
    while (*str1 == *str2)
    {
        str1++;
        str2++;
    }
    if (*str1 > *str2)
    {
        return 1;
    }
    else if (*str1 < *str2)
        {
        return -1;
        }
    else
    {
        return 0;
    }
}
int main()
{
    char ch1[] = "abcdef";
    char ch2[] = "abcq";
    int ret = my_strcmp(ch1, ch2);
    printf("%d\n", ret);
    return 0;
}

好了,今天先分享这几个函数,学会的可以去,试试看哦!有不懂的,可以在评论区留言哦!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值