C语言-字符串函数

前言:

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。

字符串是c语言中最有用,最重要的数据类型之一。c的库函数里提供大量的函数用于读写字符串、拷贝字符串、比较字符串、合并字符串、查找字符串等。

下面就来介绍下一些字符串函数的介绍和使用。

  • strlen 函数

常量字符串中双引号里的字符在最后都会由\0来结尾。\0也是一个字符,通常我们不必刻意去加上\0,因为在被双引号引起的字符都会在末尾自动加上\0

strlen函数也是通过\0来进行结束的。

  1. strlen函数有什么用呢?

strlen函数用来计算在\0之前的字符有多少个。

下面就来用一下这个函数吧。

#include <stdio.h>//printf的头文件
#include <string.h>//strlen的头文件

int main()
{
    char arr[] = { "abcdef" };
    int len = strlen(arr);
    printf("%d\n", len);
    return 0;
}

结果:

当然我们也可以实验下strlen是不是计算\0之前的字符。

在arr里的字符中间加上\0就行了。

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

int main()
{
    char arr[] = { "abc\0def" };
    int len = strlen(arr);
    printf("%d\n", len);
    return 0;
}

结果:

通过实验发现strlen的确计算的是\0之前的字符。

  1. 模拟实现strlen函数

当然我们也可以来模拟实现一下strlen函数

我这里采用的是计数器的方式来进行计算的,就是在\0之前找字符,有一个字符就++一下。当遇见\0之后就退出。

那我们就来看一下代码:

#include <stdio.h>
#include <assert.h>//assert的头文件

int my_strlen(const char* str)
{
    assert(str);
    int count = 0;
    while (*str != '\0')
    {
        count++;
        str++;
    }
    return count;
}

int main()
{
    char arr[] = { "abcdef" };
    int len = my_strlen(arr);
    printf("%d\n", len);
    return 0;
}

结果:

介绍完strlen函数之后,咱们再来看看strcpy函数。

  • strcpy函数

  1. strcpy函数的介绍

strcpy函数是把一个字符串里的字符拷贝的另外一个字符空间里。

strcpy函数也是以\0进行结束的,但是它会把\0也一起拷贝到目标空间里。

当然使用strcpy函数也有一些要注意的地方。

1.源字符串必须以 '\0' 结束。

2.会将源字符串中的 '\0' 拷贝到目标空间。

3.目标空间必须足够大,以确保能存放源字符串。

4.目标空间必须可变。

  1. strcpy函数使用

了解完strcmp函数之后我们就来使用一下这个函数。

我们在主函数里写两个字符数组用来存放字符,arr1是要拷贝的字符,arr2是要接收arr1拷贝过来的字符数组。当然arr2空间里必须得存放的下arr1的字符,这里就用20个字节就好啦。然后用strcpy来拷贝,strcpy函数的第一个元素是目标空间的地址,也就是arr2。第二个元素是要拷贝过去的字符地址,也就是arr1。

最后就打印arr2看一些是否拷贝进去没有咯。

看一下代码吧:

#include <string.h>//strcpy的头文件

int main()
{
    char arr1[] = { "abcdef" };
    char arr2[20] = { 0 };
    strcpy(arr2, arr1);
    printf("%s\n", arr2);
    return 0;
}

结果:

  1. strcpy函数的实验

当然我们也可以实验一下这函数,看一下是不是拷贝的时候是不是把\0一起拷贝过去了。

可以把arr2里的内容初始化为xxxxxxxxx然后进调试看是不是真的把\0拷贝过去了。

代码:

int main()
{
    char arr1[] = { "abcdef" };
    char arr2[20] = { "xxxxxxxxxx" };
    strcpy(arr2, arr1);
    printf("%s\n", arr2);
    return 0;
}

可以看见arr2里前10个字节已经被初始化为x了。

当我们用strcpy拷贝之后,可以看见在拷贝字符串的最后也有个\0。说明\0也被拷贝过去了。

调试结果:

  1. 模拟strcpy函数

了解完strcpy函数咱们就来模拟一下吧。

在my_strcpy过来的参数里,第一个元素就叫dest好了,第二个叫src好了。当然他们都用指针指向了起始地址的。如果要用char*来返回的话,就定义一个char*类型的ret变量来存放dest的起始地址就好了。

然后我们直接用一个while循环,把想要拷贝的字符不断赋值给 目标空间里,然后再后置++一下,先拷贝,再++,当不断赋值把\0赋值给dest时while循环判定\0为假就结束循环。然后就拷贝完成。

当然因为我们有返回值,也可以直接打印

代码:

char* my_strcpy(char* dest, const char* src)
{
    assert(dest, src);
    char* ret = dest;
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

int main()
{
    char arr1[] = { "abcdef" };
    char arr2[20] = { "xxxxxxxxxx" };
    my_strcpy(arr2, arr1);
    printf("%s\n", arr2);
    //当然因为我们有返回值,也可以直接打印
    printf("%s\n", my_strcpy(arr2, arr1));
    return 0;
}

结果:

  • strcat函数

  1. strcat函数的介绍

strcat函数是将在一个字符数组的最后添加另外一个字符数组。

strcat函数是以\0的位置开始添加的。添加的时候直接覆盖\0

当然strcat也是有使用要求的

  1. 源字符串必须以 '\0' 结束。

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

  1. 目标空间必须可修改。

  1. strcat函数的使用

int main()
{
    char arr1[20] = { "hello " };
    char arr2[] = { "world" };
    strcat(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

结果:

  1. strcat函数的实验

当然我们也可以实验下strcat函数是不是直接从\0开始追加字符。

直接在hello后边加上\0xxxxxx,然后调试一下。

int main()
{
    char arr1[20] = { "hello \0xxxxxxxx" };
    char arr2[] = { "world" };
    strcat(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

调试:现在还没放进去

可以看见\0直接被覆盖了

  1. 模拟strcat函数

这个函数也可以模拟一下

首先我们可以用while不断对my_strcat第一个元素dest进行++,当找到\0之后就停下,这个时候的第一个元素dest就指向\0,这个时候,就直接像上边strcpy函数一样拷贝就好。

当然也可以有返回函数,那么也用ret来存一下dest的首地址就好。

代码:

char* my_strcat(char* dest, const char* src)
{
    assert(dest, src);
    char* ret = dest;
    //找到\0
    while (*dest != '\0')
    {
        dest++;
    }
    //拷贝
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

int main()
{
    char arr1[20] = { "hello \0xxxxxxxx" };
    char arr2[] = { "world" };
    my_strcat(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

结果:

  • strcmp函数

  1. strcmp函数介绍

strcmp函数是比较两个字符串

标准规定:

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

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

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

  1. strcmp函数的使用

了解完strcmp函数之后我们就来使用一下吧。

因为strcmp函数需要一个整形来接收返回值,那就定义个int ret接收就好了。

代码:

#include <string.h>

int main()
{
    char arr1[] = { "abcfe" };
    char arr2[] = { "abb" };
    int ret = strcmp(arr1, arr2);
    printf("%d\n", ret);
    return 0;
}

结果:

可以看见第一个字符串大于第二个字符串所以返回一个大于0的1回来。

如果第二个字符串也是abcfe,和第一个字符串相等那么返回的就是0咯。

  1. 模拟strcmp函数

模拟strcmp函数名就叫my_strcmp里面的第一个参数就叫str1,第二个就叫str2,

然后不断用while循环来不断比较两个字符串当,两个字符串相等时,进去判断,然后返回0,不等于就

结束循环,然后返回str1 - str2的值。两个指针相减得到的是它们之间的元素。第一个大就返回大于0的值,第二个大就返回小于0 的值。

代码:

#include <string.h>
#include <assert.h>

int my_strcmp(const char* str1, const char* str2)
{
    assert(str1, str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
        {
            return 0;
        }
        str1++;
        str2++;
    }
    return *str1 - *str2;
}
int main()
{
    char arr1[] = { "abcfe" };
    char arr2[] = { "abb" };
    int ret = my_strcmp(arr1, arr2);
    printf("%d\n", ret);
    return 0;
}

结果:

可以看见也很好的计算出来了。

  • strncpy函数

之前的一些函数还是有些不太安全的地方,比如用strcpy函数拷贝6个字符到只有3个字符空间的时候,strcpy它不会看3个字符空间到底装不装的下,它只会往里存,最后就造成了越界访问了。

所以就出现了有限制的strncpy函数,它和strcpy函数差不多,只是多一个你想拷贝多少个字符的参数。

下面就来看看这个函数的使用把。

  1. strncpy函数的使用

int main()
{
    char arr1[] = { "abcdef" };
    char arr2[20] = { 0 };
    strncpy(arr2, arr1, 3);
    printf("%s\n", arr2);
    return 0;
}

strncpy参数里的3就是你想要拷贝的字符数量。

结果:

  • strncat函数

strncat函数和strcat函数大同小异,也是多一个限制而已。比如你想要拷贝4个字符到目标空间,那么就它就只会找到目标空间的\0拷贝然后覆盖\0开始拷贝,最后它也会放上\0.

  1. strncat函数的使用

代码:

int main()
{
    char arr1[20] = { "hello \0xxxxxxxxx" };
    char arr2[] = { "bitabc" };
    strncat(arr1, arr2, 4);
    printf("%s\n", arr1);
    return 0;
}

结果:

  • strncmp函数

strncmp函数也只是多一个参数,比如你想要比较3个字符串,它就只会比较前3 个字符。当然他们也会返回一定的值。

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

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

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

  1. strncmp函数

代码:

int main()
{
    char arr1[] = { "abcdef" };
    char arr2[] = { "abc" };
    int ret = strncmp(arr1, arr2, 3);
    printf("%d\n", ret);
    return 0;
}

结果:

前3个字符相等所以返回0;

结尾

目前的字符串函数就介绍到这里,但是还是有一些字符串函数,这里就不一 一介绍了。

这里写的哪里有不对的地方,还请指出,我这里会进行更改,谢谢大家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值