C语言 字符串函数

在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语⾔标准库中提供了一系列库函数,接下来我们就学习一下这些函数。

strlen strcpy strcat strcmp strncpy strncat strncmp函数的头文件为<string.h>

1、strlen的使用及模拟实现。

size_t  strlen ( char * str )

•字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包
含 '\0' )。
• 参数指向的字符串必须要以 '\0' 结束。
• 注意函数的返回值为size_t,是无符号的( 易错 )
• strlen的使⽤需要包含头文件


1、1  strlen函数的使用如下。  

#include<stdio.h>
 #include<stdio.h>
int main()
{
    char arr[] = "hello world";
    printf("%d", strlen(arr));
}

 1、2  strlen函数的模拟实现

#include<stdio.h>
int my_strlen(char* p)
{
    int count=0;
    while (*p++ != '\0')
        count++;
    return count;
}
int main()
{
    char arr[] = "hello world";
    printf("%d", my_strlen(arr));
}

2、strcpy的使用及模拟实现。

char* strcpy(char * destination, const char * source )

•将源指向的C字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)
• 将源字符串中的 '\0' 拷⻉到目标空间。
• 目标空间必须足够大,以确保能存放源字符串

2、1 strcpy的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char str1[20] = "abcd";
    char str2[] = "hello world";
    strcpy(str1,str2 );
    printf("%s", str1);
    return 0;
}

2、2 strcpy 的模拟。

#include<stdio.h>
char* my_strcpy(char* str1, char* str2)
{
    char* p = str1;//str1的地址进入循环会改变,所以将str1原本的地址记录起来
    while (*str2 != '\0')//str2指向'\0'跳出循环
    {
        *str1++ = *str2++;//将str2一一赋值给str1
    }
    return p;//返回str1的地址
}
int main()
{
    char str1[20] = "abcd";
    char str2[] = "hello world";
    printf("%s", my_strcpy(str1, str2));
    return 0;
}

3、strcat的使用及模拟实现。

char* strcat( char* destination,char* source )

• 将源字符串的追加到目标字符串中。destinnation的终止字符被source第一个字符覆盖。
•源字符串必须以 '\0' 结束。
•会将源字符串中的 '\0' 拷贝到⽬标空间。
•目标空间必须足够⼤,以确保能存放源字符串。

3、1 strcat的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char str1[20] = "hello";
    char str2[] = "world";
    printf("%s", strcat(str1, str2));
    return 0;
}
 

3、2 strcat的模拟

#include<stdio.h>
char* my_strcat(char* str1, char* str2)
{
    char* ret = str1;//同上述函数,记录此时str1的地址
    while (*str1 != '\0')//找到str1的终止字符并跳出循环
        str1++;
    while (*str2 != '\0')
        *str1++ = *str2++;
    return ret; //输出str1;
}
int main()
{
    char str1[20] = "hello";//给定字符数组大小
    char str2[] = "world";
    printf("%s", my_strcat(str1,str2));
}

4、strcmp的使用及模拟实现。

int strcmp ( char* str1, char* str2)

•将相对应位置字符的ascii值一一比较
•第⼀个字符串⼤于第二个字符串,则返回大于0的数字。
•第⼀个字符串等于第二个字符串,则返回0。
•第⼀个字符串小于第二个字符串,则返回小于0的数字。

4、1 strcmp的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char str1[] = "abcd";
    char str2[] = "abce";
    printf("%d",strcmp(str1, str2));//strcmp库函数只会输出数字结果,并不会直接输出大小信息
    //若数字为正数,则str1大于str2
    //若数字为0,则str1等于str2
    //若数字为负数,则str1小于str2
}
 

4、2 strcmp的模拟

#include<stdio.h>
#include<assert.h>
int my_strcmp(char* str1, char* str2)
{
    assert(str1 && str2);//若str1或者str2为空,会弹出警告,增加安全性
    while (*str1 == *str2)
    {
        if (*str1 == '\0')//这里说明str1和str2完全相等
            return 0;
        str1++;
        str2++;
    }
    return *str1 - *str2;//利用两者ASCII的差值直接得出大小
}
int main()
{
    char str1[] = "abcd";
    char str2[] = "abc";
    printf("%d ",my_strcmp(str1, str2));
}

 strncpy strncat strncmp函数与上述函数只有一字之差,作用也大体相似。

n代表了选择性的进行函数操作。

那么下面来学习它们的不同之处吧。

5、strncpy的使用及模拟实现。

char* strncpy (char* destinnation , char* source,size_t num )

•拷贝num个字符从源字符串到⽬标空间。
•如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个(我看了很多小编的strncpy函数是没有补加0的,需要注意)

5、1 strncpy的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char str1[20] = "abcd";
    char str2[] = "hello world";
    strncpy(str1, str2, 20);
    printf("%s", str1);
    return 0;
}
 

5、2  strncpy的模拟

#include<stdio.h>
char* my_strncpy(char* str1, char* str2,size_t n)
{
    char* p = str1;//str1的地址进入循环会改变,所以将str1原本的地址记录起来
    int i = n;//记录n原本的值
    while(n--&&*str2!='\0')
    {
        *str1++ = *str2++;//将str2一一赋值给str1
    }
    if(i>strlen(str2))//需要复制的字符数大于str2字符长度时,用0补充
        while (n--)
        {
            *str1++ = '0';
        }
    *str1 = '\0';
    return p;//返回str1的地址
}
int main()
{
    char str1[20] = "abcd";
    char str2[] = "hello world";
    my_strncpy(str1, str2,20);
    printf("%s", str1);
    return 0;
}

6、strncat的使用及模拟实现。

char* strncat (char* destinnation , char* source,size_t num )

.将source的n个字节复制到destination后 

6、1 strncat的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char str1[20] = "hello";
    char str2[] = "world";
    printf("%s", strncat(str1, str2,3));
    return 0;
}
 

6、2 strncat的模拟

#include<stdio.h>
char* my_strcat(char* str1, char* str2,size_t n)
{
    char* ret = str1;//同上述函数,记录此时str1的地址
    while (*str1 != '\0')//找到str1的终止字符并跳出循环
        str1++;
    while (*str2 != '\0'&&n--)
        *str1++ = *str2++;
    return ret; //输出str1;
}
int main()
{
    char str1[20] = "hello";//给定字符数组大小
    char str2[] = "world";
    printf("%s", my_strcat(str1,str2,3));
}

7、strncmp的使用及模拟实现。

int  strncat (char* destinnation , char* source,size_t num )

 比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字⺟,如果提前发现不一样,就提前结束,大的字符所在的字符串⼤于另外一个。如果num个字符都相等,就是相等返回0

7、1 strncmp的使用

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
    char str1[] = "abcde";
    char str2[] = "abce";
    printf("%d",strncmp(str1, str2, 4));//strcmp库函数只会输出数字结果,并不会直接输出大小信息
    //若数字为正数,则str1大于str2
    //若数字为0,则str1等于str2
    //若数字为负数,则str1小于str2
}

7、2 strncmp的模拟

#include<stdio.h>
#include<assert.h>
int my_strncmp(char* str1, char* str2,size_t n)
{
    assert(str1 && str2);//若str1或者str2为空,会弹出警告,增加安全性
    while (*str1 == *str2&&--n)//注意这里为--n;
    {
        if (*str1 == '\0')//这里说明str1和str2完全相等
            return 0;
        ++str1;
        ++str2;
    }
    return *str1 - *str2;//利用两者ASCII的差值直接得出大小
}
int main()
{
    char str1[] = "abcd";
    char str2[] = "abc";
    printf("%d ",my_strncmp(str1, str2,4));
}

看到这里,喜欢作品就留下小红心再走吧 ,能得到你们的支持是我创作的不竭动力。

我会力所能及地与你们分享知识,关注我,下篇学习初步数据结构哦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值