C语言 | strcat-strncat-strcmp-strcpy-strncpy-strncpy_s-memcpy_strncpy拷贝函数,虽然计算了复制的大小,但是也不安全,没有检查目标的边界。-程序员宅基地

技术标签: c语言  Linux 编程  

1、strcat

C 标准库 - <string.h>

描述

C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。

声明

下面是 strcat() 函数的声明。

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

参数

dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
src – 指向要追加的字符串,该字符串不会覆盖目标字符串。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

实例

下面的实例演示了 strcat() 函数的用法。

#include <stdio.h>
#include <string.h>
 
int main () {
    
   char src[50], dest[50];
   strcpy(src,  "This is source");
   strcpy(dest, "This is destination");
   strcat(dest, src);
   printf("最终的目标字符串: |%s|", dest);
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:
最终的目标字符串: |This is destinationThis is source|

2、strncat

C 标准库 - <string.h>

描述

C 库函数 char *strncat(char *dest, const char *src, size_t n) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。

声明

下面是 strncat() 函数的声明。

char *strncat(char *dest, const char *src, size_t n)

参数

dest – 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
src – 要追加的字符串。
n – 要追加的最大字符数。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

实例

下面的实例演示了 strncat() 函数的用法。

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

int main () {
    
   char src[50], dest[50];
   strcpy(src,  "This is source");
   strcpy(dest, "This is destination");
   strncat(dest, src, 15);
   printf("最终的目标字符串: |%s|", dest);
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:
最终的目标字符串: |This is destinationThis is source|

3、strcmp

C 标准库 - <string.h>

描述

C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

声明

下面是 strcmp() 函数的声明。

int strcmp(const char *str1, const char *str2)

参数

str1 – 要进行比较的第一个字符串。
str2 – 要进行比较的第二个字符串。

返回值

该函数返回值如下:

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

实例

下面的实例演示了 strcmp() 函数的用法。

#include <stdio.h>
#include <string.h>
 
int main () {
    
   char str1[15];
   char str2[15];
   int ret;
   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");
   ret = strcmp(str1, str2);
   if(ret < 0) {
    
      printf("str1 小于 str2");
   } else if(ret > 0) {
    
      printf("str1 大于 str2");
   } else  {
    
      printf("str1 等于 str2");
   }
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:str1 大于 str2

4、strcpy

C 标准库 - <string.h>

描述

C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。

需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。strcpy函数会导致内存溢出。strcpy拷贝函数不安全,他不做任何的检查措施,也不判断拷贝大小,不判断目的地址内存是否够用。

声明

下面是 strcpy() 函数的声明。

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

参数

dest – 指向用于存储复制内容的目标数组。
src – 要复制的字符串。

返回值

该函数返回一个指向最终的目标字符串 dest 的指针。

实例

#include <stdio.h>
#include <string.h>
 
int main() {
    
   char src[40];
   char dest[100];
   memset(dest, '\0', sizeof(dest));
   strcpy(src, "This is runoob.com");
   strcpy(dest, src);
   printf("最终的目标字符串: %s\n", dest);
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:
最终的目标字符串: This is runoob.com

5、strncpy

strncpy拷贝函数,虽然计算了复制的大小,但是也不安全,没有检查目标的边界。

C 标准库 - <string.h>

描述

C 库函数 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。

声明

下面是 strncpy() 函数的声明。

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

参数

dest – 指向用于存储复制内容的目标数组。
src – 要复制的字符串。
n – 要从源中复制的字符数。

返回值

该函数返回最终复制的字符串。

实例

下面的实例演示了 strncpy() 函数的用法。在这里,我们使用函数 memset() 来清除内存位置。

#include <stdio.h>
#include <string.h>
 
int main() {
    
   char src[40];
   char dest[12];
   memset(dest, '\0', sizeof(dest));
   strcpy(src, "This is runoob.com");
   strncpy(dest, src, 10);
   printf("最终的目标字符串: %s\n", dest);
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:
最终的目标字符串: This is ru

6、strncpy_s

目前,strncpy是字符串拷贝推荐的用法

加_s版本则是从VS2005开始推出的安全版本,

而加_s版本之所以安全,是因为他们在接口增加了一个参数numElems来表明dest中的字节数,

防止目标指针dest中的空间不够而导致出现Bug,同时返回值改成返回错误代码,而不是为了一些所谓的方便而返回char*。这样接口的定义就比原来安全很多。

但是,_s版本并不是标准库,所以,不推荐使用

7、memcpy

memcpy拷贝函数,它与strcpy的区别就是memcpy可以拷贝任意类型的数据,strcpy只能拷贝字符串类型。

C 标准库 - <string.h>

描述

C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1。

声明

下面是 memcpy() 函数的声明。

void *memcpy(void *str1, const void *str2, size_t n)

参数

str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
n – 要被复制的字节数。

返回值

该函数返回一个指向目标存储区 str1 的指针。

实例

// 将字符串复制到数组 dest 中
#include <stdio.h>
#include <string.h>

int main () {
    
   const char src[50] = "http://www.runoob.com";
   char dest[50];
   memcpy(dest, src, strlen(src)+1);
   printf("dest = %s\n", dest);
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:dest = http://www.runoob.com

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/God__Rain/article/details/120188944

智能推荐

东周科目三考场5号线_全国科目三考场考试视频视频教程方法秘籍攻略步骤及注意事项技巧!...-程序员宅基地

文章浏览阅读4.8k次。全国科目三考场考试视频教程教学专业讲解语音实地视频讲解专业收费版实地考场讲解语音高清流畅,绝非免费版可比,助你考试一把过!路考16项,项目多细节全。比科目二的难度有过之而无不及,稍不注意就直扣100分。很多学员考完科三都是一身的汗,因为必须绷紧了神经才能保证所有的细节不会出错。要是小问题出错,技术再牛也白搭。考前多看几遍视频牢记要点!助你考试一把过!科目三考场考试视频教程教学专业讲解语音..._深圳驾考科目三东周考场

UDS简介-程序员宅基地

文章浏览阅读366次。UDS简介

【mmdet3d配置】win11+Debian子系统_win11 debian-程序员宅基地

文章浏览阅读1k次。mmdet3d +win11+Debian子系统不想安装双系统,又馋windows的UI,还需要linux的生产力,毕竟很多代码暂时只支持linux。所以就有了这篇文章~_win11 debian

Environment.Exit(0)和Environment.Exit()方法-程序员宅基地

文章浏览阅读1.5w次,点赞5次,收藏17次。net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法2009年04月09日 23:59:00 fengloveyun 阅读数:1470.net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法.net类库已经帮助我们实现了窗口的关闭,如果此窗口是系统的主窗口,关闭此窗口即应..._environment.exit

JAVA中十四种常见开发工具及其特点-程序员宅基地

文章浏览阅读125次。1、JDK (Java Development Kit)Java开发工具集 SUN的Java不仅提了一个丰富的语言和运行环境,而且还提了一个免费的Java开发工具集(JDK)。开发人员和最终用户可以利用这个工具来开发java程序。  JDK简单易学,可以通过任何文本编辑器(如:Windows 记事本、UltrEdit、Editplus、FrontPage以及dreamweaver..._五种java开发工具的使用现状和特点

解决XP下鼠标单击变双击的问题_xp鼠标自动双击-程序员宅基地

文章浏览阅读2.1k次。我的光电鼠标,按左键经常出现单击变双击的情况,有时写Blog的时候,在浏览器的多窗口切换时,老是因为这个问题把辛辛苦苦写的内容就这么关闭,非常郁闷。虽然可以通过外接鼠标解决问题,但有时候毕竟不是那么方便。记得曾经见过某个软件能解决这个问题,今天找了下,果然找到了,还是cnbeta出品的。DoubleClickFix是一个鼠标双击修正工具,对于旧鼠标特别有效果。下面是这个软件的介绍:用久了都会出_xp鼠标自动双击

随便推点

项目中的富文本编辑器该如何选择?_vue-quill-editor 和 tinymce那个好用-程序员宅基地

文章浏览阅读393次。项目中经常需要用到富文本编辑器的时候,而常见的富文本编辑器都有哪些?该如何选择?先看看市面上都有哪些可用的富文本编辑器:TinyMCE(插件式的,支持 Vue,React,Angular 框架)wangEditor(Typescript 开发的 Web 富文本编辑器, 轻量、简洁、易用、开源免费,支持 JS 直接引入使用,或者 Vue2/3,React)UEditor(开源,插件多,功能齐全,支持 JS 直接引入使用)CKEditor(模块化的简洁强大,丰富的框架支持,支持 Vue,React._vue-quill-editor 和 tinymce那个好用

雨流法工具箱rainflow进行疲劳分析教程(含雨流法rainflow工具箱下载及安装教程)_matlab中rainflow函数-程序员宅基地

文章浏览阅读6.5k次,点赞4次,收藏23次。雨流计数法又可称为“塔顶法”,是20世纪50年代由英国的Matsuiski和Endo 两位工程师提出的, 距今已有50 多年。雨流计数法主要用于工程界, 特别在疲劳寿命计算中运用非常广泛。把应变-时间历程数据记录转过90°,时间坐标轴竖直向下, 数据记录犹如一系列屋面, 雨水顺着屋面往下流, 故称为雨流计数法。雨流计数法对载荷的时间历程进行计数的过程反映了材料的记忆特性,具有明确的力学概念,因此该..._matlab中rainflow函数

vscode中python自定义包的模块如何导入其子包模块_vscode使用python导入自定义模块-程序员宅基地

文章浏览阅读3.2k次。本文在个人博客的链接问题描述如图所示,对于python,有一个自定义包parent,它里面还有一个子包child,当你在parent.module1中import child.module2时,vscode会给你报错,说找不到这个包。当你单独运行module1.py的时候,可以正常运行,但是当你在parent包外层的main.py中import parent.module1时,就会报错。详细说明目录结构为:main.pyparent__init__.pymodule1.py_vscode使用python导入自定义模块

flume学习01-flume介绍_根据指导书学习flume的使用,可以采用不同的flume数据源,学会flume的配置要求不能-程序员宅基地

文章浏览阅读396次。最近学习了下flume的使用,以配合公司将日志系统独立出来的开发,官网用户手册:http://flume.apache.org/FlumeUserGuide.htmlflume架构a. 组件先搬上官网上的架构图从图上可以看到flume的事件定义成了一个数据流,一个数据流组成了Agent,其实就是JVM实例,每个Agent包含三个组件:Source_根据指导书学习flume的使用,可以采用不同的flume数据源,学会flume的配置要求不能

Github上一款一键生成数据库文档的大利器!_github 支持达梦数据库生成表结构文档-程序员宅基地

文章浏览阅读3.1k次,点赞16次,收藏91次。文章目录介绍快速开始表结构脚本基于 Java 代码引入 screw 及相关依赖代码编写基于 Maven 插件引入screw及相关依赖配置maven-plugins手动执行生成数据库文档成品地址介绍今天看了 Guide老哥 公众号(需要的朋友可以关注一波: JavaGuide)中的一篇文章,发现了一款好用的数据库文档生成工具。在项目中开发中,有没有遇到过编写数据库说明文档。一般情况下,数据库说明文档中有着大量的数据库表结构,如果手动进行维护,将会耗费大量时间,这样就不能愉快的进行摸鱼了。所以呢,为了解_github 支持达梦数据库生成表结构文档

充电器pps功能是什么_倍思18W快充充电器拆解,这套快充方案天猫精灵充电器都在用...-程序员宅基地

文章浏览阅读599次。最近我们拿到Baseus倍思18W USB PD快充充电器,这款产品机身光滑,棱边圆润,除了支持18W功率充电器里常规三组固定电压档位外,还支持两组PPS电压档位,能够很好的支持18W以下用电设备,此外最大18W PD快充功率也能满足iPhone11等智能手机的日常充电。下面我们就和大家分享这款产品的拆解,看看其内部用料如何。一、倍思18W PD充电器外观倍思典型的黄白配色包装盒,包装盒上端带有挂..._快充 pps