C语言----strcpy和strcat的使用和模拟实现

news2024/11/14 13:46:55

一,strcpy()函数

strcpy() 函数是 C语言中一个非常重要的字符串处理函数,其功能是将一个字符串复制到另一个字符串中。该函数原型如下:

char*strcpy(char*dest,const char*src)

其中,dest 表示目标字符串,即将被复制到的字符串;src 表示源字符串,即将被复制的字符串。函数返回一个指向目标字符串的指针。

具体使用方法

我们可以先定义一个源字符串,arr1和一个目标字符串arr2,然后调用strcpy()函数将源字符串arr1中的内容复制到arr2中,最后我们可以使用printf()函数输出源字符串和目标字符串的值。

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[] = "Hello World";
    char arr2[100];
    strcpy(dest, src);
    printf("Source String: %s\n", arr1);
    printf("Destination String: %s\n", arr2);
    return 0;
}

运行结果

我们可以看到arr1和arr2打印的结果是一样的,说明strcpy()函数正确的将arr1中的内容复制到arr2中了

注意

1,在使用strcpy()函数时arr2一定要有足够大的空间来储存arr1中复制过来的内容,否则,就会导致内存越界和数据丢失,

2,由于 strcpy() 函数的第二个参数是一个 const char * 类型,即源字符串是只读的,因此在复制过程中不会改变源字符串的值。

二,strcat()函数

strcat函数可以将一个字符串拼接到另一个字符串的末尾,

char*strcat(char*dest,const char*src)

#include <stdio.h>
#include <string.h>
int main()
{
    char str1[50] = "Hello";
    char str2[50] = "World";
    strcat(str1, str2);
    printf("Result: %s\n", str1);
    return 0;
}

运行结果

我们可以看到strcat()函数将字符串arr2拼接到字符串arr1的末尾。strcat()函数用于将一个字符串拼接到字符串的末尾,同样,strcat()函数也要注意内存的越界。

三,strncpy()函数

有时候我们需要复制一个字符串的前 n 个字符,而不是整个字符串。可以使用 strncpy() 函数来实现这个功能,

char *strncpy(char *dest, const char *src, size_t n);

其中,dest 表示目标字符串,即将被复制到的字符串;src 表示源字符串,即将被复制的字符串;n 表示要复制的字符数。函数返回一个指向目标字符串的指针。
也就是说,strncpy()函数是将 src 指向的前 n 个字符拷贝到 dest 字符数组中:

  • 如果 src 的长度小于 n,strncpy() 函数将在 dest 的剩余部分用空字符填充,凑齐 n 个字符。
  • 如果 src 的长度大于或等于 n,则复制的字符串将不会以空字符结尾。这可能会导致未定义的行为,因为许多字符串操作都依赖于空字符来识别字符串的结尾。

例如:我们需要将arr1中的前5个字符复制到arr2中

#include <stdio.h>
#include <string.h>
int main()
{
    char arr1[] = "Hello World";
    char arr2[100];
    strncpy(arr2, arr1, 5);
    printf("Source String: %s\n", arr1);
    printf("Destination String: %s\n", arr2);
    return 0;
}

结果

strncpy也可以截取一个字符串中的一段字符串

比如我们使用 strncpy() 函数将源字符串 str 中的第 6 个字符开始的 5 个字符复制到源字符串中,然后使用空字符将字符串截断。最终结果为"World"。

需要注意的是,strncpy() 函数复制的字符数必须小于或等于源字符串的长度,否则可能会导致未定义的行为。

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "Hello World";
	strncpy(str, str + 6, 5);
	str[5] = '\0';
	printf("Result: %s\n", str);
	return 0;
}

运行结果


 

四,strcpy的模拟实现

在c语言中,我们定义一个字符数组arr1将字符串储存在字符数组中。字符数组本质上是一个指向字符的指针。因此我们可以使用指针来实现字符串的复制操作。

#include<stdio.h>
#include<assert.h>
void my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* p = dest;
	while(*src!='\0')
	{
		*dest++ = *src++;
		
	}
	*dest = '\0';
	
}

int main()
{
	char arr1[] = "wanglongbao";
	char arr2[100];
	my_strcpy(arr2, arr1);
	printf("arr1=%s\n", arr1);
	printf("arr2=%s\n", arr2);
	return 0;
}

运行结果

五,strcat的模拟实现

#include<stdio.h>
#include<assert.h>
void my_strcat(char* dest, const char* scr)
{
	assert(dest && scr);
	while (*dest != '\0')
	{
		dest++;
	}
	while (*scr != '\0')
	{
		*dest++ = *scr++;
	}
	*dest = '\0';

}
int main()
{
	char arr1[] = "wanghongbao";
	char arr2[] = "jiayou";
	my_strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AttributeError: ‘_MSDataLoaderIter‘ object has no attribute ‘_put_indices‘

问题描述 复现代码过程中遇到错误&#xff1a;AttributeError: _MSDataLoaderIter object has no attribute _put_indices 解决方案 出错的原因是代码中使用了不存在的属性"_put_indices"。这个错误可能与你使用的版本不兼容有关。在pytorch1.x版本中&#xff0c;&q…

江苏开放大学2023年春《液压与气压传动060246》第2形考作业占形考成绩的25%参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 电大搜题 多的用不完的题库&#xff0c;支持文字、图片搜题&am…

Unable to authenticate, need: BASIC realm=“Sonatype Nexus Repository Manager“

问题 使用公司的私有源&#xff0c;执行 npm i 的时候突然报错了&#xff1a; 解决 执行命令 npm config list找到 .npmrc 去掉对应的这一行即可&#xff0c;或者使用 nrm 工具执行 nrm del xxx 删掉私有源&#xff0c;然后在添加私有源也可。可以参考我这篇&#xff1a;使…

七个项目管理经典案例分析

案例一 赵晓东是海正公司的员工&#xff0c;最近感到很烦恼。公司签下了一份价值超过100万的合同&#xff0c;由于双方老板关系密切&#xff0c;都希望项目能够尽快启动&#xff0c;所以在签订合同时没有举行正式的签字仪式。合同签署后&#xff0c;公司老总立即指定赵晓东和其…

【C++】虚拟继承 组合

目录 一、虚拟继承 &#x1f31f;【非虚拟内存分布】 &#x1f31f;【虚拟继承内存分布】 &#x1f31f;【虚拟继承读取】 &#x1f31f;【练习检验】 &#x1f31f;【继承的总结和反思】 二、组合 &#x1f31f;【继承和组合】 &#x1f31f;【前言回顾】 上一篇文章我们…

计算机程序的编译和链接

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

day51 动态规划part8

139. 单词拆分 中等 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 难点&#xff1a;很难想到要用完…

【VALL-E-02】核心原理

本文系个人知乎专栏文章迁移 VALL-E 网络是GPT-SOVITS很重要的参考 知乎专栏地址&#xff1a; 语音生成专栏 相关文章链接&#xff1a; 【VALL-E-01】环境搭建 【VALL-E-02】核心原理 【参考】 【1】Neural Codec Language Models are Zero-Shot Text to Speech Synthesiz…

【MATLAB源码-第168期】基于matlab的布谷鸟优化算法(COA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 布谷鸟优化算法&#xff08;Cuckoo Optimization Algorithm, COA&#xff09;是一种启发式搜索算法&#xff0c;其设计灵感源自于布谷鸟的独特生活习性&#xff0c;尤其是它们的寄生繁殖行为。该算法通过模拟布谷鸟在自然界中…

总结虚函数表机制——c++多态底层原理

前言&#xff1a; 前几天学了多态。 然后过去几天一直在测试多态的底层与机制。今天将多态的机制以及它的本质分享给受多态性质困扰的友友们。 本节内容只涉及多态的原理&#xff0c; 也就是那张虚表的规则&#xff0c;有点偏向底层。 本节不谈语法&#xff01;不谈语法&#x…

Redis中RDB的dirty机制和AOF中的后台重写机制

RDB的dirty计数器和lastsave属性 服务器除了维护saveparams数组之外&#xff0c;还维持着一个dirty计数器,以及一个lastsave属性: 1.dirty计数器记录距离上一次成功执行SAVE命令或者BGSAVE命令之后&#xff0c;服务器对数据库状态(服务器中的所有数据库)进行了多少次修改(包括…

2.4 如何运行Python程序

如何运行Python程序&#xff1f; Python是一种解释型的脚本编程语言&#xff0c;这样的编程语言一般支持两种代码运行方式&#xff1a; 1) 交互式编程 在命令行窗口中直接输入代码&#xff0c;按下回车键就可以运行代码&#xff0c;并立即看到输出结果&#xff1b;执行完一行…

YOLOv5从入门到入土!(一)训练教程

一、下载 代码地址&#xff1a;https://github.com/ultralytics/yolov5 前往YOLOv5官方github&#xff0c;按照图中步骤下载代码及预训练权重。 二、训练 将下载的预训练权重路径填入train.py的weights参数中&#xff0c;并补全其余必要文件。 关于data.yaml看往期教程&#x…

fifo ip核 ————读写时钟同步

1.原理 timescale 1ns/1ns module tb_fifo();reg sys_clk ; reg sys_rst_n ; reg [7:0] pi_data ; reg rd_req ; reg wr_req ; reg [2:0] cnt;wire empty ; wire full ; wire [7:0] po_data ; wire [7:0] usedw ;initial begins…

下载网页上的在线视频 网络视频 视频插件下载

只需要在浏览器上安装一个插件&#xff0c;就可以下载大部分的视频文件&#xff0c;几秒到一两个小时的视频&#xff0c;基本都不是问题。详细解决如下&#xff1a; 0、因为工作需要&#xff0c;需要获取某网站上的宣传视频&#xff0c;我像往常一样&#xff0c;查看视频的url…

VUE:内置组件<Teleport>妙用

一、<Teleport>简介 <Teleport>能将其插槽内容渲染到 DOM 中的另一个位置。也就是移动这个dom。 我们可以这么使用它: 将class为boxB的盒子移动到class为boxA的容器中。 <Teleport to".boxA"><div class"boxB"></div> &…

Redis入门到实战-第三弹

Redis入门到实战 Redis数据类型官网地址Redis概述Redis数据类型介绍更新计划 Redis数据类型 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#…

Linux文件系统 底层原理

linux文件、目录、Inode inode负责文件的元数据和数据存储&#xff0c;文件存储块负责实际数据的存储&#xff0c;而目录文件维护文件名和inode之间的联系。 1. 用户空间到内核空间 首先&#xff0c;当用户程序请求打开一个文件时&#xff08;例如使用open系统调用&#xff09…

Linux账号管理与ACL权限设置

文章目录 Linux的账户和用户组用户标识符&#xff1a;UID与GID用户账号用户组&#xff1a;有效与初始用户组groups&#xff0c;newgrp 账号管理新增与删除用户&#xff1a;useradd、相关配置文件、passwd、usermod、userdel用户功能&#xff1a;id、finger、chfn、chsh新增与删…

Prometheus(四):VMware Vsphere监控及数据展示

目录 1 vmware exporter安装配置1.1 vmware exporter介绍1.2 安装 - 使用kubernetes部署1、下载2、修改配置文件3、执行安装4、查看 1.3 安装-使用docker的方式1.4 Prometheus配置1.5 Grafana配置&#xff08;模板页面还需要修改&#xff09; 总结 1 vmware exporter安装配置 …