snprintf和strcpy和strncpy的区别

2023-11-03

概述

snprintfstrcpystrncpy这几个函数的功能都是将原字符串拷贝到目的字符串中。但是在细节部分还是存在着一些细微的差别。主要参考man说明。

snprintf

格式

int snprintf(char *str, size_t size, const char *format, ...);

说明

The functions snprintf() and vsnprintf() write at most size bytes (including the terminating null byte (‘\0’)) to str.
即,snprintf会把源字符串拷贝到目的地址。如果源字符串的长度大于约束条件size,那么会拷贝size - 1个字符到目的地址,并将最后一个字符赋值为'\0'

例子

#include <iostream>
#include <string.h>
using namespace std;
int main() {
    char buf[10] = {0};
    snprintf(buf, 10, "hello word");
    cout << buf << ", " << strlen(buf) << ", " << sizeof(buf) <<  endl;
    return 0;
}

输出结果如下:
在这里插入图片描述

可以看出,目的内存buf只能存放10个字符,而"hello word"加上最后的'\0',总共有11个字符,因此snprintf最多拷贝9个字符到buf中,并将最后一个字符设置为'\0'

strcpy

格式

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

说明

The strcpy() function copies the string pointed to by src, including the terminating null byte (‘\0’), to the buffer pointed to by dest. The strings may not overlap, and the destination string dest must be large enough to receive the copy.
strcpysrc整个字符串(包括“\0”)拷贝到dest中。如果src字符串(包括“\0”)的长度大于dest的空间大小,会导致数组越界的bug

例子

#include <iostream>
#include <string.h>
using namespace std;
int main() {
    char buf[8] = {0};
    char buf1[8] = {0};
    char buf2[8] = {0};
    //snprintf(buf, 10, "hello word");
    //strncpy(buf1,  "hello wrod_nice", 10);
    strcpy(buf1,  "hello word");
    //cout << buf << ", " << strlen(buf) << ", " << sizeof(buf) <<  endl;
    cout << buf1 << ", " << strlen(buf1) << ", " << sizeof(buf1) <<  endl;
    cout << buf2 << ", " << strlen(buf2) << ", " << sizeof(buf2) <<  endl;
    return 0;
}

输出结果如下:
在这里插入图片描述
可以看出,原本拷贝到buf1中的数据,覆盖了buf2中的数据。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

strncpy

格式

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

说明

The strncpy() function is similar, except that at most n bytes of src are copied. Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated. If the length of src is less than n, strncpy() writes additional null bytes to dest to ensure that a total of n bytes are written.
strncpysnprintf的区别在于,如果srcn个字符没有包含"\0",那么strncpy不会将"\0"拷贝到dst中。

例子

int main() {
    char buf[8] = {0};
    char buf1[8] = {0};
    char buf2[8] = {0};
    //snprintf(buf, 10, "hello word");
    strncpy(buf1,  "hello word", 8);
    //strcpy(buf1,  "hello word");
    //cout << buf << ", " << strlen(buf) << ", " << sizeof(buf) <<  endl;
    cout << buf1 << ", " << strlen(buf1) << ", " << sizeof(buf1) <<  endl;
    cout << buf2 << ", " << strlen(buf2) << ", " << sizeof(buf2) <<  endl;
    return 0;
}

输出如下图所示
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

snprintf和strcpy和strncpy的区别 的相关文章

  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • 疯壳-鸿蒙OS-工具安装指南

    1 将Linux shell改为bash 1 查看shell是否为bash 在终端运行如下命令 ls l bin sh 如果为显示为 bin sh gt bash则为正常 否则请按以下方式修改 方法一 在终端运行如下命令 然后选择 no s
  • Weblogic远程代码执行漏洞(CVE-2020-14645)

    简介 WebLogic是美国Oracle公司出品的一个application server 确切的说是一个基于JAVAEE架构的中间件 WebLogic是用于开发 集成 部署和管理大型分布式Web应用 网络应用和数据库应用的Java应用服务
  • Linux进程间通信机制

    Linux下的通信手段基本上是从Unix平台上的进程通信机制继承而来 Linux下的进程通信通信机制主要包括 管道 Pipe 及有名管道 named pipe 管道可用于具有亲缘关系进程间的通信 有名管道克服了管道没有名字的限制 因此 除具
  • C语言之求两个整数之和。

    思路 定义三个变量 a b sum a和b用来存放两个加数 sum用来存放和 include
  • C语言—循环结构的总结

    循环结构的三种基本结构 特点 在给定条件成立时 反复执行每段程序 直到条件不成立为止 一次又一次的执行相同代码 1 while循环 基本框架 表达式1 while 表达式2 语句 表达式3 lt 1 gt while后面的语句称为循环体 l
  • 现代密码学-传统密码技术(置换、代换密码)

    目录 置换密码 换位密码 列置换 周期置换 代换密码 单表代换密码 多表代换密码 参考 置换密码 换位密码 置换密码 Permutation Cipher 又叫换位密码 Transposi tionCipher 它根据一定的规则重新排列明文
  • 管理_立项任务书怎么写——毛宇菲

    内容转自公众号 硬件十万个为什么 作者 毛宇菲 当一个项目的很多细节点存在疑问的时候 那就说明这是一个 没有想清楚的项目 了 类似的有 项目目标不能量化 结果不可测量 投入资源不能衡量 等等问题 如何从源头上规避 没想清楚的项目 呢 第一
  • 闭包Closure

    x xxx 概念 控制台打断点 闭包的作用 return外部函数使用内部变量 当闭包形成时下的写法才有用 闭包的经典样式
  • 微信订单管理软件列表支持小程序(逻辑猫订货系统)

    订货信息管理系统 订货系统的作用 在线订单管理系统 订货系统又名 订单管理系统 订单管理系统分为销售订单和订货订单 这里的订货系统信息管理用于厂家的客户进行订货 并非商城 客户可通过订货端进行订货 订货系统支持的版本 订货系统 订单信息管理
  • gcc与g++的使用

    1 gcc编译器的基本语法格式如下 gcc 选项 准备编译的文件 选项 目标文件 例如 编译名为 test c 的c程序 gcc test c o test 2 若使用gcc编译器编译c 程序 与编译c程序略有不同 若cpp文件中未使用任何
  • 面具卡米怎么删模块_面具magisk ROOT如何更新到最新版本两种实用方法彻底解决...

    面具magisk作者会不定期的更新维护magisk 对magisk的升级维护 以便支持更多的安卓设备 目前已知最新版magisk已支持安卓11系统 对于已经刷入面具root的小伙伴 怎么最快速的升级最新版本呢 ROM乐园小编两种方法教你快速
  • Go 项目

    1 如果想要删除旧的包 直接在go mod注释一下 2 想要指定分支 自己运行 不要使用它提示的sync 方式一 执行以下命令 go get git地址 分支名 如 go get github com golang go master 方式
  • input type="file" 上传文件

    input type file 上传文件 显示上传图片 并替换上传按钮的位置 限制上传格式可以用 accept 比如 accept doc docx 限制上传文件为doc docx 其他的都不可以
  • 思睿嘉得数据泄露防护系统DLP如何卸载?(无需卸载口令的方法)

    之前在某公司实习的时候 带自己的电脑去需要安装这个软件 后面怎么都卸载不掉 也找了网上的很多方法 都行不通 研究了一阵子 终于找到了绕过密码口令卸载的方法 具体步骤如下 启动安全模式 windows10的方法见链接 https suppor
  • 数据结构——堆

    堆 堆的概念 堆 heap 是计算机科学中一类特殊的数据结构的统称 堆通常是一个可以被看做一棵树的数组对象 即是一种顺序储存结构的完全二叉树 1 提示 完全二叉树 完全二叉树 对一棵深度为k 有n个结点二叉树编号后 各节点的编号与深度为k的
  • 2021.11.3-11.4总结

    1 将C语言的单链表看完 简单了解了一下typedef的用法 2 继续数据结构的学习 将线性表的基础知识已学完 因为将C语言的结构体学习了 所以再次重看线性表的顺序表和单链表 比以前更容易理解 更加理解指针 懂了线性表的存储结构 顺序表 单
  • 为什么重写equals()方法时必须重写hashCode()方法【详解】

    目录 一 为什么重写equals 方法时必须重写hashCode 方法 1 关于hashCode 的约定 hashCode 方法源码注释 2 equals 方法和hashCode 方法的关系 3 为什么一定要使用 hashcode 方法 举
  • HTML小白入门学习1

    目录 一 什么是HTML 二 HTML的语法 2 1 基本结构 2 1 1 基本结构的解释 三 实体 3 1 什么是实体 3 2 实体的语法 四 常用的标签 4 1 常用标签 目录 一 什么是HTML 二 HTML的语法 2 1 基本结构
  • C# 调用可执行exe文件几种方法小结

    1 利用进程池方式启动 string exefile xxx exe if File Exists exefile Process process new Process params 为 string 类型的参数 多个参数以空格分隔 如果
  • snprintf和strcpy和strncpy的区别

    概述 snprintf strcpy strncpy这几个函数的功能都是将原字符串拷贝到目的字符串中 但是在细节部分还是存在着一些细微的差别 主要参考man说明 snprintf 格式 int snprintf char str size