字符函数和字符串函数(一)

ok,兄弟们,这篇文章我们来看一些关于籽富含鼠和字符串函数的知识。

重点介绍处理字符和字符串的库函数的使用和注意事项

ok,废话少说,我们直接开始介绍第一个函数,

1.strlen

strlen

看过我之前文章的都知道,这个函数是用来求长度的。

下面我们先来看一下这个函数的定义 。

size_t strlen( const char *string );

通过定义,我们不难发现,这个函数的返回值是size_t类型,也就是unsigned int类型的数据,而他的参数是一个被const修饰的字符指针。

对于这一个函数,我们需要注意的是一下几点。

1.字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )

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

3.注意函数的返回值为size_t,是无符号的

 在知道了这些东西之后,我们就可以使用这个函数了,因为这个函数的使用方法比较简单,所以这里我们就不再给出使用的栗子了。

然后,我们来看一下下面代码的输出结果

#include <stdio.h>
int main()
{
 const char*str1 = "abcdef";
 const char*str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
     printf("str2>str1\n");
 } 
 else
 {
     printf("srt1>str2\n");
 }
 return 0;
}

这里最后的输出结果是str2>str1,为什么呢,这其实跟strlen这个函数的返回值有关,众所周知,这个函数的返回值是size_t类型的,也就是一个无符号数,所以自然相减之后不会出现负数。

此外在这里补充一下

实际上  CPU里只有加法器  没有减法器   做a-b运算时,实际上是做了a+(~b)

然后呢,我们来看一下关于strlen的模拟实现,这个函数的实现思路非常的简单,这里我们就直接上代码了。

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

int main()
{
    char arr[] = "azaz_plus";
    printf("%u", my_strlen(arr));
    return 0;
}

 当然,除此之外,我们还可以用很多方法实现,比如递归,或者是指针减指针的形式,在这里我们就不做示范了。

2.strcpy

ok,下面我们要看的这个函数其实从他的字面意思就能看出来,他是一个功能为复制的函数。

我们还是先来看他的定义

char *strcpy( char *strDestination, const char *strSource );

从他的定义就可以看出,这个函数的返回值类型为char*,参数一个是可改变的指针,另一个是不可改变的指针。

这个函数的功能是把后面指针指向的内容复制给前面指针指向的内容。

我们不妨用用它写一段代码看一下,

 

 

 从这里,我们不难看出这个函数的作用,将第二个参数复制给第一个参数,其中包括第二个参数中的\0,并且,他会返回第一个参数的地址。其中我们把第一个参数叫做目标空间,第二个参数叫做源字符串。

对于这个函数,我们有以下几点注意事项。

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

2.该函数会将源字符串的'\0'也拷贝到目标空间里。

3.必须确保目标空间足够容纳源字符串里的内容。

4.目标空间必须是可变的。

5.如果目标空间与源字符串之间有任何的重叠,那么这个结果都是未定义的。(但是在厚些编译器中,这个问题已经得到了解决,比如VS2019)

在了解了这些写之后,我们就来看一下这个函数的模拟实现,直接上代码吧

char* my_strcpy(char* str1, const char* str2)
{
    char* p = str1;
    while (*str2 != '\0')
    {
        *str1 = *str2;
        str1++;
        str2++;
    }
    *str1 = '\0';
    return p;
}

int main()
{
    char arr[] = "azaz_plus";
    char ch[] = "azaz";
    char* p = my_strcpy(arr, ch);
    printf("%s\n", p);
    printf("%s\n", arr);
    return 0;
}

细心的同学已经发现了,我们的这个代码是有很多问题的,比如说未考虑空指针或者是源字符串与目标空间重合的问题。这个留给大家自己练习吧,我会在之后更新出一篇文章,来详细的讲述更全面的写法,在这里我们只是基本实现他的功能来了解他大概的原理。 

3.strcat

下面我们来看一下这个叫strcat的函数,首先来看他的声明。

char *strcat( char *strDestination, const char *strSource );

这个声明方式跟strcpy接近,其实这个函数的功能是

Appends a copy of the source string to the destination string. The terminating null character
in destination is overwritten by the first character of source, and a null-character is included
at the end of the new string formed by the concatenation of both in destination.

我们敲代码的得学会看英文的文档,这里大家先看着适应一下。

这个函数的功能是,在目标空间后追加源字符串的内容,然后返回目标空间的地址。

对于这个函数有以下几点注意事项

1.源字符串必须以 '\0' 结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3.目标空间必须可修改。
4.目标空间与源字符串不能有任何的重叠,重叠之后的结果是未定义的。

然后我们来简单的看一下关于这个函数功能的模拟实现

char* my_strcat(char* str1, const char* str2)
{
    char* p = str1;
    while (*str1!='\0')
    {
        str1++;
    }
    while (*str2!='\0')
    {
        *str1 = *str2;
        str1++;
        str2++;
    }
    *str1 = *str2;
    return p;
}
int main()
{
    char arr[20] = "azaz_plus";
    char ch[] = "azaz";
    char* p = my_strcat(arr, ch);
    printf("%s\n", p);
    printf("%s\n", arr);
    return 0;
}

 4.strcmp

 老规矩,先来看声明。

int strcmp( const char *string1, const char *string2 );
This function starts comparing the first character of each string. If they are equal to each
other, it continues with the following pairs until the characters differ or until a terminating
null-character is reached.

其实这个函数的主要功能是比较两个字符串的大小,然后返回一个int类型的值,其标准如下

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

那么,如何判断两个字符串的大小呢?

其实类似于数字的比较,比如说我们比较927和934的时候,可以先比较第一个数字9,如果他们相同再去比较第二个数字,我们发现3>2,因此,第二个数字更大,其实字符串的比较也是差不多的,不同的是他比较的是ACISS码值。也是逐个比较,比如abc和cde,先比较第一个,发现c的ACISS码大于a所以,就没有继续的必要了,直接范慧莹一个小于零的数字就好了。如果比较bc和bcd,先比较第一个,发现相等,然后比较第二个,又相等,之后开始比较第三个,但是一个字符串没有第三个字符,所以自然是第二个字符串大。

 不妨举个栗子

好的,在了解了他的大体应用之后就来模拟实现一个这个函数的功能吧。

 我们还是直接上代码。

int my_strcmp(const char* str1, const char* str2)
{
    while ((*str1 == *str2) && (*str1 != '\0'))
    {
        str1++;
        str2++;
    }
    return *str1 - *str2;
}


int main()
{
    char arr[20] = "azaz_plus";
    char ch[] = "azaz";
    char ch1[] = "abc";
    char ch2[] = "def";
    char ch3[] = "abc";
    if (my_strcmp(arr, ch) > 0)
    {
        printf("arr>ch\n");
    }
    if (my_strcmp(ch1, ch2) < 0)
    {
        printf("ch1<ch2\n");
    }
    if (my_strcmp(ch1, ch3) == 0)
    {
        printf("ch1=ch2\n");
    }
    return 0;
}

 

 好的,这一篇文章就到这里,在下一篇文章中,我会讲解关于strncpy,ctncat,strncmp,strstr,strtok等函数。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值