鱼C论坛

 找回密码
 立即注册
查看: 23458|回复: 18

[函数快查] strncpy -- 拷贝字符串(受限)

[复制链接]
发表于 2016-3-31 03:29:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
strncpy 函数文档


函数概要:

strcpy 函数一样,strncpy(dest, src, n) 函数将拷贝源字符串的 n 个字符到目标数组中。如果源字符串的长度小于 n,那么就用 '\0' 填充额外的空间。如果源字符串的长度大于或等于 n,那么只有 n 个字符被拷贝到目标数组中(注意:这样的话将不会以结束符 '\0' 结尾)。

小甲鱼温馨提示:为了使该函数更“安全”,建议使用 dest[sizeof(dest) - 1] = '\0'; 语句确保目标字符串是以 '\0' 结尾。

源字符串和目标数组的位置不应该重叠。


函数原型:
#include <string.h>
...
char *strncpy(char *dest, const char *src, size_t n);

参数解析:

参数
含义
dest 指向存放字符串的目标数组
src 指向待拷贝的源字符串
n 指定拷贝的最大长度


返回值:

返回值是指向目标字符串的指针。


演示:
#include <stdio.h>
#include <string.h>

int main()
{
        char str1[] = "To be or not to be";
        char str2[40];
        char str3[40];

        strncpy(str2, str1, sizeof(str2));
        strncpy(str3, str2, 5);
        str3[5] = '\0';

        printf("%s\n", str1);
        printf("%s\n", str2);
        printf("%s\n", str3);

        return 0;
}
搜狗截图20160331032857.png

版权归鱼C工作室(www.fishc.com)所有,转载请注明来源!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-28 15:09:10 | 显示全部楼层
本帖最后由 Bayesky 于 2017-8-28 15:11 编辑

似乎VS里面的strncpy函数会自己加'\0'呢,我试了好几个不手动添加'\0'的都没有报错。

更新:试了一下您给的例程,果然报错了。。。看来是运气问题。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-2 01:46:59 | 显示全部楼层
Bayesky 发表于 2017-8-28 15:09
似乎VS里面的strncpy函数会自己加'\0'呢,我试了好几个不手动添加'\0'的都没有报错。

更新: ...

确实是这样的我用code::blocks也是会自动添加
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-15 21:21:54 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-22 10:35:16 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-16 16:47:59 | 显示全部楼层
一点疑问 如果这里把str3[5]='\0'去掉 程序输出结果没有变化,但是内在会出什么问题吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 17:26:41 | 显示全部楼层
Yth961102zxc 发表于 2020-4-16 16:47
一点疑问 如果这里把str3[5]='\0'去掉 程序输出结果没有变化,但是内在会出什么问题吗

这个你可以通过调试观察一下str3的值,理论上没有str3[5]='\0',最后一句除了To be,后面应该是输出乱码的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 10:04:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-2 12:32:32 | 显示全部楼层

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-2 12:36:36 | 显示全部楼层
dest[sizeof(dest) - 1] = '\0';
这个判据484应该改为:
dest[sizeof(dest) - 1] == '\0';

保护狗头
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2021-2-18 16:08:51 | 显示全部楼层
讲得好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-20 22:45:20 | 显示全部楼层
2020.7.7 发表于 2021-2-2 12:36
dest = '\0';
这个判据484应该改为:
dest == '\0';

不对吧  赋值的语句你改成判断了   条件表达式了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-11 00:59:28 | 显示全部楼层
只要是关于str的函数,最后是不是都会自己加上'\0'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-25 15:37:20 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-25 15:41:12 | 显示全部楼层
想知道 dest[sizeof(dest) - 1] = '\0' 和dest[n] = '\0' 有什么区别 我感觉在strncpy函数使用上后者才是对的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-11 12:08:56 | 显示全部楼层
dest[sizeof(dest) - 1] = '\0';这个目的是啥我知道 但是这个是啥意思我到现在还不知道
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-3-19 14:17:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-20 16:43:37 | 显示全部楼层
为什么我这个str3打印的是be be  
#include <stdio.h>
#include <string.h>

int main()
{
        char str1[] = "To be or not to be";
        char str2[40];
        char str3[40];
        char str4[3];

        strncpy(str2, str1, sizeof(str2));
        strncpy(str3, str2, 5);
        str3[5] = '\0';
        strncpy(str4, str1, 5);

        printf("str1:%s--%d\n", str1, strlen(str1));
        printf("str2:%s--%d\n", str2, strlen(str2));
        printf("str3:%s--%d\n", str3, strlen(str3));
        printf("str4:%s--%d\n", str4, strlen(str4));

        return 0;
}

str1:To be or not to be--18
str2:To be or not to be--18
str3:be be--5
str4:To be be--8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-6 21:46:39 | 显示全部楼层
2020.7.7 发表于 2021-2-2 12:36
**** 作者被禁止或删除 内容自动屏蔽 ****

在这里,应该没啥区别
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 09:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表