strncpy和strcpy区别_C语言strncpy

strncpy和strcpy区别_C语言strncpyDefinedinheader <string.h>char *strncpy( char *dest, const ch

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Defined in header 
<string.h>
   
  (1)  
char *strncpychar *dest, const char *src, size_t count );
(until C99)
char *strncpychar *restrict dest, const char *restrict src, size_t count );
(since C99)
errno_t strncpy_s(char *restrict dest, rsize_t destsz,
                  const char *restrict src, rsize_t count);
(2) (since C11)
     
1) Copies at most count characters of the character array pointed to by src (including the terminating null character, but not any of the characters that follow the null character) to character array pointed to by dest.
 If count is reached before the entire array src was copied, the resulting character array is not null-terminated.
 If, after copying the terminating null character from srccount is not reached, additional null characters are written to dest until the total of count characters have been written.
 The behavior is undefined if the character arrays overlap, if either dest or src is not a pointer to a character array (including if dest or src is a null pointer), if the size of the array pointed to by dest is less than count, or if the size of the array pointed to by src is less than count and it does not contain a null character.
2) Same as (1), except that the function does not continue writing zeroes into the destination array to pad up to count, it stops after writing the terminating null character (if there was no null in the source, it writes one at dest[count] and then stops). Also, the following errors are detected at runtime and call the currently installed constraint handler function:

  • src or dest is a null pointer
  • destsz or count is zero or greater than RSIZE_MAX
  • count is greater or equal destsz, but destsz is less or equal strnlen_s(src, count), in other words, truncation would occur
  • overlap would occur between the source and the destination strings
 The behavior is undefined if the size of the character array pointed to by dest < strnlen_s(src, destsz) <= destsz; in other words, an erroneous value of destsz does not expose the impending buffer overflow. The behavior is undefined if the size of the character array pointed to by src < strnlen_s(src, count) < destsz; in other words, an erroneous value of count does not expose the impending buffer overflow.

As with all bounds-checked functions, 
strncpy_s is only guaranteed to be available if 
__STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including string.h.

Parameters

dest pointer to the character array to copy to
src pointer to the character array to copy from
count maximum number of characters to copy
destsz the size of the destination buffer

Return value

1) returns a copy of dest
2) returns zero on success, returns non-zero on error. Also, on error, writes zero to dest[0] (unless dest is a null pointer or destsz is zero or greater than RSIZE_MAX) and may clobber the rest of the destination array with unspecified values.

Notes

As corrected by the post-C11 DR 468, strncpy_s, unlike strcpy_s, is only allowed to clobber the remainder of the destination array if an error occurs.

Unlike strncpystrncpy_s does not pad the destination array with zeroes, This is a common source of errors when converting existing code to the bounds-checked version.

Although truncation to fit the destination buffer is a security risk and therefore a runtime constraints violation for strncpy_s, it is possible to get the truncating behavior by specifying count equal to the size of the destination array minus one: it will copy the first count bytes and append the null terminator as always: strncpy_s(dst, sizeof dst, src, (sizeof dst)1);

Example

#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h> #include <stdio.h> #include <stdlib.h>   int main(void) { char src[] = "hi"; char dest[6] = "abcdef"; // no null terminator strncpy(dest, src, 5); // writes five characters 'h', 'i', '\0', '\0', '\0' to dest printf("strncpy(dest, src, 5) to a 6-byte dest gives : "); for(size_t n = 0; n < sizeof dest; ++n) { char c = dest[n]; c ? printf("'%c' ", c) : printf("'\\0' "); }   printf("\nstrncpy(dest2, src, 2) to a 2-byte dst gives : "); char dest2[2]; strncpy(dest2, src, 2); // truncation: writes two characters 'h', 'i', to dest2 for(size_t n = 0; n < sizeof dest2; ++n) { char c = dest2[n]; c ? printf("'%c' ", c) : printf("'\\0' "); } printf("\n");   #ifdef __STDC_LIB_EXT1__ set_constraint_handler_s(ignore_handler_s); char dst1[6], src1[100] = "hello"; int r1 = strncpy_s(dst1, 6, src1, 100); // writes 0 to r1, 6 characters to dst1 printf("dst1 = \"%s\", r1 = %d\n", dst1,r1); // 'h','e','l','l','o','\0' to dst1   char dst2[5], src2[7] = {'g','o','o','d','b','y','e'}; int r2 = strncpy_s(dst2, 5, src2, 7); // copy overflows the destination array printf("dst2 = \"%s\", r2 = %d\n", dst2,r2); // writes nonzero to r2,'\0' to dst2[0]   char dst3[5]; int r3 = strncpy_s(dst3, 5, src2, 4); // writes 0 to r3, 5 characters to dst3 printf("dst3 = \"%s\", r3 = %d\n", dst3,r3); // 'g', 'o', 'o', 'd', '\0' to dst3 #endif }

Possible output:

strncpy(dest, src, 5) to a 6-byte dst gives : 'h' 'i' '\0' '\0' '\0' 'f'
strncpy(dest2, src, 2) to a 2-byte dst gives : 'h' 'i'
dst1 = "hello", r1 = 0
dst2 = "", r2 = 22
dst3 = "good", r3 = 0

References

  • C11 standard (ISO/IEC 9899:2011):
  • 7.24.2.4 The strncpy function (p: 363-364)
  • K.3.7.1.4 The strncpy_s function (p: 616-617)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.21.2.4 The strncpy function (p: 326-327)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.11.2.4 The strncpy function

 

 

From: https://en.cppreference.com/w/c/string/byte/strncpy

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168104.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月3日 下午10:16
下一篇 2022年8月3日 下午10:16


相关推荐

  • eclipse中导入maven工程「建议收藏」

    eclipse中导入maven工程「建议收藏」1.导入工程Maven->ExistingMavenProjects,选择项目路径,点击Next2.点击Finish选择需要导入的maven项目,点击Finish

    2022年5月6日
    50
  • 一个汉字是几个字节

    一个汉字是几个字节一个汉字是几个字节常用中文字符用 utf 8 编码占用 3 个字节 大约 2 万多字 但超大字符集中的更大多数汉字要占 4 个字节 在 unicode 编码体系中 U 20000 开始有 5 万多汉字 GBK GB2312 收编的汉字占 2 个字节 严格地用 iso8859 1 无法表示汉字 只能转为问号 代码演示如下 publicstatic String args throwsUnsupp

    2026年3月19日
    3
  • 常用JS——string字符串方法

    常用JS——string字符串方法一 关于字符串分割 1 slice start end 关于这个方法 一定要搞懂四个关键点 1 截取字符串时不包括下标为 end 的元素 2 end 是可选参数 没有时 默认从 start 到结束的所有字符串 3 String slice 与 Array slice 区别 4 参数为负数时 是如何处理的 其中第 3 点其实就是在 JavaScript 中字符串和数组都具有这个方法 它们

    2026年3月19日
    2
  • CentOS 安装 semanage 命令

    CentOS 安装 semanage 命令

    2021年10月18日
    41
  • 如何通过jmeter测试大模型性能【QPS篇】

    如何通过jmeter测试大模型性能【QPS篇】

    2026年3月13日
    3
  • 离散数学知识点总结

    离散数学知识点总结3 1 高级概念 k core k truss k clique k club p cohesion k edge vertexconnec k shell 同态核 像同态定理 单 甲是乙的一个子群 满 甲的一个商群是乙 非单非满 甲的一个商群是乙的一个子群 双 甲就是乙 2 一阶逻辑基本概念 个体词 常项 变项 约束 自由 假言推理 附加 化简 拒取 假言三段论 析取三段论 构造性二难 破坏性二难 合取引入 2 基本概念 点 边 邻域 前驱 后继 关联边 端点 相邻边 割 桥

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号