为什么应该使用 strncpy 而不是 strcpy?

2023-12-03

编辑:我已经添加了示例的源代码。

我碰到这个例子:

char source[MAX] = "123456789";
char source1[MAX] = "123456789";
char destination[MAX] = "abcdefg";
char destination1[MAX] = "abcdefg";
char *return_string;
int index = 5;

/* This is how strcpy works */
printf("destination is originally = '%s'\n", destination);
return_string = strcpy(destination, source);
printf("after strcpy, dest becomes '%s'\n\n", destination);

/* This is how strncpy works */
printf( "destination1 is originally = '%s'\n", destination1 );
return_string = strncpy( destination1, source1, index );
printf( "After strncpy, destination1 becomes '%s'\n", destination1 );

产生了这个输出:


destination is originally = 'abcdefg'
After strcpy, destination becomes '123456789'

destination1 is originally = 'abcdefg'
After strncpy, destination1 becomes '12345fg'
  

这让我想知道为什么有人想要这种效果。看起来会很混乱。这个程序让我觉得你基本上可以用 Tom Bro763 复制某人的名字(例如 Tom Brokaw)。

使用有什么好处 strncpy() over strcpy()?


The strncpy()函数的设计考虑到了一个非常特殊的问题:操作以原始 UNIX 目录条目的方式存储的字符串。它们使用一个短的固定大小的数组(14 字节),并且仅当文件名比数组短时才使用 null 终止符。

这就是这两个奇怪现象背后的原因strncpy():

  • 如果目的地已完全填满,它不会在目的地上放置一个零终止符;和
  • 它总是完全填充目的地,如果需要的话用 null 填充。

为了“更安全strcpy()“,你最好使用strncat()像这样:

if (dest_size > 0)
{
    dest[0] = '\0';
    strncat(dest, source, dest_size - 1);
}

这总是会导致结果无效,并且不会复制超出必要的内容。

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

为什么应该使用 strncpy 而不是 strcpy? 的相关文章

随机推荐

  • 同一任务上的多次等待可能会导致阻塞

    在同一个任务上使用多个等待应该小心 我在尝试使用时遇到过这种情况BlockingCollection GetConsumingEnumerable 方法 最终得到这个简化的测试 class TestTwoAwaiters public vo
  • 如何自动启动Solr?

    此刻我必须去 usr java apache solr 1 4 0 example然后执行以下操作 java jar start jar 如何让它在启动时自动启动 我在共享 Linux 服务器上 当您使用共享 Linux 机器时 您可能必须
  • 如何在C#中分割多个字符串

    我的问题包括如何分割这样的字符串 List of devices attached r n9887bc314 tdevice r n12n1n2nj1jn2 tdevice r n r n Into n9887bc314 n12n1n2nj
  • 类似函数的宏和奇怪的行为

    我已经开始阅读 Effective C 在第 2 项中的某个时刻 提到了以下内容 call f with the maximum of a and b define CALL WITH MAX a b f a gt b a b int a
  • 如何将 iPhone 应用程序本地化为不同的语言?

    谁能解释一下如何本地化 iPhone 应用程序 我对 XCode 本地化概念感到困惑 首先 您可以在项目设置中定义要管理的语言 这不是一项必要的工作 但从那里开始真是太好了 然后 对于您想要本地化的每个 XIB 单击它 转到属性面板并添加所
  • 如何连接具有相同前缀(和多个前缀)的文件?

    我有许多具有相同前缀的文件 只有下划线后面的位不同 我也有很多前缀 下划线不会出现在文件名中的其他位置 如何将具有相同前缀的所有文件连接成一个新文件 我补充说 我有数千个不同的前缀 我无法将它们提供给循环 你可以这样做 cat path p
  • iAds 无法显示时留下白色块

    自从更新到 iOS 5 以来 我遇到了 iAds 问题 我发现当广告无法显示时 它会在 iAd 通常所在的位置显示一个大的白色块 有办法解决这个问题吗 我尝试将 iAd 的背景颜色设置为与 UIView 的背景颜色相匹配 但这不起作用 非常
  • 如何将 optgroup 添加到 django ModelMultipleChoiceField?

    我有一个表格ModelMultipleChoiceField到类别列表 我想使用以下方法对类别进行分组Category group field 我认为通过改变领域 choices在 init 函数中它会起作用 class Categorie
  • 使用 qsort 函数以替代方式对整数数组进行排序。

    我最近学习了qsort函数 此 C 代码给出了不正确的输出 需要帮助 问题 以替代方式对整数数组进行排序 偶数索引和奇数索引的元素分别排序 输出 0 4 1 2 5 8 7 5 9 3 10 5 include
  • 两个数组的高效匹配(如何使用KDTree)

    我有两个二维数组 obs1 and obs2 它们代表两个独立的测量系列 并且都具有dim0 2 并且略有不同dim1 say obs1 shape 2 250000 and obs2 shape 2 250050 obs1 0 and o
  • 对数轴标签/刻度定制

    我正在使用JFreeChart用于在我的 Java 应用程序中生成一些图表的 API 在我的一张图表中 我尝试使用LogAxis对象通过以下代码使我的 y 轴成为对数刻度轴 图中的 A LogAxis logAxis new LogAxis
  • 忘记了密钥库密码,正在考虑暴力检测。它会损坏密钥库吗?

    我最近意识到我丢失了密钥库的密码 或者密钥库可能以某种方式损坏了 它一直给我错误 密钥库被篡改或密码不正确 我创建了一个 相当未优化的 算法 通过让它运行整夜来暴力破解密码 但是 我不确定有多少次不成功的密码尝试会锁定密钥库 有谁知道这样的
  • 如何将多个文件附加到Android中的电子邮件客户端

    我在用Intent ACTION SEND获取默认电子邮件客户端 它工作正常 但现在我需要将多个文件附加到电子邮件中 email putExtra android content Intent EXTRA STREAM 仅附加最后添加的 u
  • Ruby roo LoadError:无法加载此类文件 - 电子表格/注释

    尝试加载 xls 文件并收到此错误 有控制台日志 irb main 001 0 gt require roo gt true irb main 002 0 gt a Roo Excel new home a xls LoadError ca
  • 如何比较条件中的两个字段/列?

    我很难弄清楚如何让子查询工作 想象一下我有 schools gt select this gt Schools gt select pupilcount gt this gt Pupils gt find gt select this gt
  • UITableView 可编辑(可重新排列),无需删除单元格

    我想知道是否有一种方法可以使 UITableView 可编辑 用户可以重新排列 移动 单个 TableView 单元格 但不会出现 删除单元格 功能 感谢您的帮助 sam 您是否尝试过实现editingStyleForRowAtIndexP
  • 已弃用、已折旧和已过时之间的区别[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 对此有很多困惑 我想知道 两者之间到底有什么区别折旧的 已弃用 and obsolete 在编程环境中 而且在一般情况下也是如此 我知道我可以看一本在线词典 而且我已经看过了 甚至很
  • 使用 console.log 检查 FormData 对象[重复]

    这个问题在这里已经有答案了 我已经创建了FormData像这样创建的对象 var data new FormData data append image input 0 files 0 data append user hubot 现在当我
  • 对列中的多个值使用 ifelse 语句

    我有一个大约有 3000 行的表 其数据格式为 Number Type 10001 0 10005 7 10006 0 10007 14 10012 16 10022 14 10023 0 10024 0 10029 7 10035 17
  • 为什么应该使用 strncpy 而不是 strcpy?

    编辑 我已经添加了示例的源代码 我碰到这个例子 char source MAX 123456789 char source1 MAX 123456789 char destination MAX abcdefg char destinati