字符串函数(一):strcpy(拷贝),strcat(追加),strcmp(比较),及strncpy,strncat,strncmp

字符串函数

  • 一.strcpy(字符串拷贝)
    • 1.函数使用
    • 2.模拟实现
  • 二.strcat(字符串追加)
    • 1.函数使用
    • 2.模拟实现
  • 三.strcmp(字符串比较)
    • 1.函数使用
    • 2.模拟实现
  • 四.strncpy
    • 1.函数使用
    • 2.模拟实现
  • 五.strncat
    • 1.函数使用
    • 2.模拟实现
  • 六.strncat
    • 1.函数使用
    • 2.模拟实现

一.strcpy(字符串拷贝)

1.函数使用

char* strcpy(char* destination, const char* source);
  • strcpy函数用于拷贝字符串,即将一个字符串中的内容拷贝到另一个字符串中(会覆盖原字符串内容)。它的参数是两个指针,第一个指针指向目标字符串的首地址,即要拷贝到什么地方。第二个指针指向来源字符串的首地址,即用什么字符串拷贝。返回值是目标字符串的首地址
#include<stdio.h>
#include<string.h>
int main()
{//char* p = NULL;//p = "zhangsan";//p是指针变量,可以赋值,将z的地址赋值给p//char name[20] = "xxxxxxxxxx";//name = "zhangsan";//err,name数组名是地址,地址是一个常量值,不能被赋值,name已经被固定死了char name1[20] = "xxxxxxxxxx";char str1[] = "zhang\0san";strcpy(name1, str1);printf("%s\n", name1);char name2[20] = "xxxxxxxxxx";char str2[] = { 'b','i','t' };strcpy(name2, str2);printf("%s\n", name2);//char* p = "abcdef";//p指向常量字符串,存放a的地址,常量字符串是不能修改的//char arr[] = "bit";//strcpy(p, arr);//err//char p[] = "abcdef";//将其放入数组中,使其变成变量可以修改//char arr[] = "bit";//strcpy(p, arr);//rightreturn 0;
}

在这里插入图片描述

  • 我们看到会将源字符串末尾的’\0’,一同拷贝到目标字符串,当源字符串末尾没有’\0’的时候,会一直向后查找,直到找到’\0’为止,停止拷贝,并将’\0’拷贝到目标字符串。

总结:

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可修改。

2.模拟实现

  • 进入函数体时先定义一个指针变量保存目标空间的起始位置,便于之后返回。然后将源字符串中的字符一一赋值给目标空间,直到遇到源字符串中的’\0’,将’\0’也赋值给目标空间后结束赋值,并返回目标空间的起始位置。
#include<assert.h>
char* my_strcpy(char* destination, const char* source)
{assert(str != NULL);//断言,若str为NULL,报错,头文件assert.h//或者直接assert(destination && source);char* str = destination;//保存目标空间的起始位置while (*source != '\0')//或者直接while (*source){*destination++ = *source++;}*destination = *source;return str;
}
  • 还可以这样更加简洁一些:
#include<assert.h>
char* my_strcpy(char* destination, const char* source)
{assert(str != NULL);//断言,若str为NULL,报错,头文件assert.hchar* str = destination;while (*destination++ = *source++;){;}return str;
}

二.strcat(字符串追加)

1.函数使用

char *strcat( char* destination, const char* Source );
  • strcat函数用于追加字符串,即将一个字符串中的内容追加到另一个字符串中。它的参数是两个指针,第一个指针指向目标字符串的首地址,即要追加到什么地方。第二个指针指向来源字符串的首地址,即用什么字符串追加。返回值是目标字符串的首地址
#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, "world");printf("%s\n", arr2);char arr3[20] = "hello ";char arr4[] = { 'a','b','c','d','e','f' };strcat(arr3, arr4);printf("%s\n", arr3);return 0;
}

在这里插入图片描述

  • 我们看到会将源字符串末尾的’\0’,一同追加到目标字符串,当源字符串末尾没有’\0’的时候,会一直向后查找,直到找到’\0’为止,停止追加,并将’\0’追加到目标字符串。

总结:

  • 源字符串必须以 ‘\0’ 结束。
  • 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
  • 目标空间必须有足够的⼤,能容纳下源字符串的内容。
  • 目标空间必须可修改。
  • 字符串不能自己给自己追加('\0’被覆盖,无终止条件,陷入死循环),这就是源字符串不能被修改的原因。

2.模拟实现

  • 进入函数体依然先定义一个指针变量用于存放目标空间的起始位置,便于之后返回。然后用循环先找到目标空间的’\0’,之后从’\0’的位置开始追加源字符串的内容,直到追加到源字符串中的’\0’为止。最后返回目标空间的起始位置。
#include<assert.h>
char* my_strcat(char* destination, const char* source)
{assert(destination && source);//断言,若str为NULL,报错,头文件assert.hchar* str = destination;//保存目标空间的起始位置//找到'\0'的位置while (*destination != '\0'){destination++;}//开始追加字符串while (*source != '\0'){*destination++ = *source++;}//添加'\0'*destination = *source;return str;
}
  • 还可以这样更加简洁一些:
#include<assert.h>
char* my_strcat(char* destination, const char* source)
{assert(destination && source);char* str = destination;while (*destination != '\0'){destination++;}while (*destination++ = *source++){;}return str;
}

三.strcmp(字符串比较)

1.函数使用

int strcmp(const char* str1,const char* str2)
  • strcmp函数用于比较两个字符串内容的函数。它的参数是两个指针,指针分别指向两个待比较字符串的首地址。它的返回值是一个整型数字。
  • 依次比较的是对应字符的ASCII值。
  • 当str1 > str2的时候返回正数。
  • 当str1 == str2的时候返回0。
  • 当str1 < str2的时候返回负数。
//错误的写法
#include<stdio.h>
int main()
{char arr1[] = "zhangsan";char arr2[] = "zhangsan";if (arr1 == arr2)printf("==\n");elseprintf("!=\n");//输出!=return 0;
}
  • 我们比较数组也许会像上面这样写,但是数组名是首元素的地址,实际上比较的是两个地址,这两个数组内容虽然一样,但它们是在栈区开辟的两个不同的空间,地址是不一样的,所以无论如何都打印不出==。
//正确的比较方法
#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "zhangsan";char arr2[] = "zhangsan";int ret = strcmp(arr1, arr2);if (ret < 0)printf("<\n");else if (ret == 0)printf("==\n");//输出==elseprintf(">\n");return 0;
}

总结:

  • 第⼀个字符串大于第⼆个字符串,则返回大于0的数字。
  • 第⼀个字符串等于第⼆个字符串,则返回0。
  • 第⼀个字符串小于第⼆个字符串,则返回⼩于0的数字。
  • 那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。

2.模拟实现

  • 进入函数体直接比较起始位置的字符的大小。如果相同并且不为’\0’那么继续比较下一对字符的大小;如果相同并且为’\0’那么说明字符串比较完毕,那么直接返回0;如果不同则直接返回str1与str2中对应字符的ASCII值的差值(当str1中对应字符大于str2中的对应字符时返回正值,当str1中对应字符小于str2中的对应字符时返回负值)。
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);//断言,若str为NULL,报错,头文件assert.hwhile (*str1 == *str2){//遇到都为'\0'的时候,说明字符串相等返回0if (*str1 == '\0')return 0;str1++;str2++;}return (*str1 - *str2);
}

以上三种字符串函数都是长度不受限制的字符串,直到’\0’为止,那有没有长度受限制的字符串函数呢?答案是有的,以下一一为您介绍。

四.strncpy

1.函数使用

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

strncpy的参数与strcpy相比较多出了一个参数,而这个参数就是被拷贝的字符的个数。

注意:

  1. num小于等于源字符串中的字符个数时,被拷贝的字符的个数由num决定。
  2. num大于源字符串中字符的个数时,strncpy函数将源字符串中的字符拷贝到目标空间后不够的将用’\0’填充。

例如:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "xxxxxxxxxx";char arr2[20] = "xxxxxxxxxx";char arr3[] = "aaaaa";strncpy(arr1, arr3, 3);strncpy(arr2, arr3, 7);printf("%s\n", arr1);printf("%s\n", arr2);return 0;
}

arr1:“aaaxxxxxxx…”,arr2:“aaaaa\0\0xxx…”。(…表示还有10个\0)。
在这里插入图片描述

2.模拟实现

char* my_strncpy(char* destination, const char* source, size_t num)
{assert(destination && source);char* ret = destination;while (*source != '\0' && num)//找到\0停止,或num==0停止{*destination++ = *source++;num--;}while (num)//若num!=0,在后面补\0,直到num==0{*destination++ = '\0';num--;}return ret;
}

五.strncat

1.函数使用

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

strncat的参数与strcat相比较多出了一个参数,而这个参数就是被追加的字符的个数。

注意:

  1. num小于源字符串中的字符个数时,被追加的字符的个数由num决定,并在追加完后再追加一个’\0’。
  2. num大于等于源字符串中的字符个数时,将源字符串内容全部追加到目标空间便结束追加,并在追加完后再追加一个’\0’。

例如:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "xxxxx\0xxxx";char arr2[20] = "xxxxx\0xxxx";char arr3[] = "aaa";strncat(arr1, arr3, 2);strncat(arr2, arr3, 5);printf("%s\n", arr1);printf("%s\n", arr2);return 0;
}

在这里插入图片描述
arr1:“xxxxxaa\0xx…”,arr2:“xxxxxaaa\0x…”。(…表示还有10个\0)。

2.模拟实现

char* my_strncat(char* destination, const char* source, size_t num)
{assert(destination && source);char* ret = destination;while (*destination != '\0')//找到\0停止{destination++;}while (*source!='\0' && num)//追加字符的两个条件{*destination++ = *source++;num--;}*destination = '\0';//在最后补上\0return ret;
}

六.strncat

1.函数使用

int strncmp ( const char * str1, const char * str2, size_t num );

strncmp的参数与strcmp相比较也多出了一个参数,而这个参数也就是需要比较的字符个数。

例如:

#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "abcdef";char arr2[] = "abc";int ret1 = strncmp(arr1, arr2, 3);int ret2 = strncmp(arr1, arr2, 4);return 0;
}
  • 当num为3时,我们比较了arr1和arr2的前3个字符,而它们前3个字符都相同,所以返回的是0;
  • 当num为4时,我们比较了arr1和arr2的前4个字符,因为字符’d’的ASCII值大于字符’\0’的ASCII值,所以返回一个正值。

2.模拟实现

int my_strncmp(const char* str1, const char* str2, size_t num)
{assert(str1 && str2);while (*str1 == *str2 && num)//保证比较前num个字符{if (*str1 == '\0')return 0;str1++;str2++;num--;}return *str1 - *str2;
}

字符串函数(一)到这就结束了,还有字符串函数(二)哦!!!!
创作不易,如果能帮到你的话能赏个三连吗?感谢啦!!!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696602.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub-wp 获取vulnhub靶机wp搜索工具

项目地址:https://github.com/MartinxMax/vulnhub-wp 简介 搜索Vulnhub平台的解题文章,之过滤返回出正确可访问的页面 使用 $ python3 vulnhubwp.py 支持模糊搜索 [] Query: kiop 进入选项4,获取wp地址 [] Choice options: 4

draw.io 网页版二次开发(1):源码下载和环境搭建

目录 一 说明 二 源码地址以及下载 三 开发环境搭建 1. 前端工程地址 2. 配置开发环境 &#xff08;1&#xff09;安装 node.js &#xff08;2&#xff09;安装 serve 服务器 3. 运行 四 最后 一 说明 应公司项目要求&#xff0c;需要对draw.io进行二次开发&…

java spring boot动态数据库获得配置信息连接多数据源(数据库)

数据库 数据库文件和代码文件 https://download.csdn.net/download/qq_34631220/89304173 链接&#xff1a;https://pan.baidu.com/s/1xoh6xiSRx4nW_gKvR1QPjg 提取码&#xff1a;i7b7 –来自百度网盘超级会员V5的分享 文章位置 添加链接描述 说明&#xff1a;事务只能单库…

☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼

准备好了么 目录&#xff1a; 一用两个队列实现栈&#xff1a; 1思路&#xff1a; 2画图理解&#xff1a; 3代码解答&#xff1a; 二用两个栈实现队列&#xff1a; 1思路&#xff1a; 2画图理解&#xff1a; 3代码解答&#xff1a; 三设计循环队列&#xff1a; 1思路…

单页源码加密屋zip文件加密API源码

简介&#xff1a; 单页源码加密屋zip文件加密API源码 api源码里面的参数已改好&#xff0c;往服务器或主机一丢就行&#xff0c;出现不能加密了就是加密次数达到上限了&#xff0c;告诉我在到后台修改加密次数 点击下载

卓豪Zoho CRM怎么收费?多少钱一年?

卓豪Zoho CRM作为一款功能强大且高度可定制的企业级客户关系管理系统&#xff0c;其收费标准因版本不同而有所差异&#xff0c;旨在满足不同规模及需求的企业。Zoho CRM提供多种套餐选择&#xff0c;包括但不限于免费版、标准版、专业版、企业版以及旗舰版。每种版本都包含了核…

leetcode-缺失的第一个正整数-96

题目要求 思路 1.这里的题目要求刚好符合map和unordered_map 2.创建一个对应map把元素添加进去&#xff0c;用map.find(res)进行查找&#xff0c;如果存在返回指向该元素的迭代器&#xff0c;否则返回map::end()。 代码实现 class Solution { public:int minNumberDisappeare…

CANopen总线_CANOpen开源协议栈

CANopen是自动化中使用的嵌入式系统的通信协议栈和设备配置文件规范。就OSI 模型而言&#xff0c;CANopen 实现了以上各层&#xff0c;包括网络层。 CANopen 标准由一个寻址方案、几个小型通信协议和一个由设备配置文件定义的应用层组成。通信协议支持网络管理、设备监控和节点…

C++11智能指针之一(简介)

1 概述 从C11开始C语言越来向现代化语言转变。尤其是智能指针的引入&#xff0c;代码中不会直接使用new/delete了。C11智能指针有三种分别是&#xff1a;shared_ptr&#xff0c;weak_ptr 和unique_ptr 。 2 类图 3 共享指针(shared_ptr) 接口函数&#xff1a; shared_ptr 构…

物联网五层架构分析

物联网五层架构分析 随着科技的迅速发展&#xff0c;物联网&#xff08;IoT&#xff09;作为日常生活中不可或缺的一部分&#xff0c;已融入人们的生活和工作中。物联网五层架构&#xff0c;包括感知层、网络层、数据层、应用层和业务层&#xff0c;扮演着关键的角色。 感知层 …

七、e2studio VS STM32CubeIDE之显示中文编码

目录 一、概述/目的 二、查看和修改文件编码 三、eclipse编码格式 3.1 优先级 3.1.1 全局workspace 3.1.2 工程 3.1.3 文件 3.1.4 全局文件的content type 二、STM32CubeIDE设置显示中文编码 二、e2studio设置显示中文编码 七、e2studio VS STM32CubeIDE之显示中文编…

4. 从感知机到神经网络

目录 1. 从感知机到神经网络 1.1 区别 1.2 定义 2. 最简单的神经网络 2.1 层神经网络 2.2 数学表达式 3. 激活函数的引入 1. 从感知机到神经网络 1.1 区别 之前章节我们了解了感知机&#xff0c;感知机可以处理与门、非与门、或门、异或门等逻辑运算&#xff1b;不过在…