小甲鱼 发表于 2016-3-31 03:29:28

strncpy -- 拷贝字符串(受限)

strncpy 函数文档

函数概要:

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

小甲鱼温馨提示:为了使该函数更“安全”,建议使用 dest = '\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;
      char str3;

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

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

      return 0;
}


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

Bayesky 发表于 2017-8-28 15:09:10

本帖最后由 Bayesky 于 2017-8-28 15:11 编辑

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

更新:试了一下您给的例程,果然报错了。。。看来是运气问题。。。

洛城闻笛 发表于 2018-8-2 01:46:59

Bayesky 发表于 2017-8-28 15:09
似乎VS里面的strncpy函数会自己加'\0'呢,我试了好几个不手动添加'\0'的都没有报错。

更新: ...

确实是这样的我用code::blocks也是会自动添加

Acacia 发表于 2020-2-15 21:21:54

{:10_280:}

以后and未来 发表于 2020-2-22 10:35:16

{:10_265:}

Yth961102zxc 发表于 2020-4-16 16:47:59

一点疑问 如果这里把str3='\0'去掉 程序输出结果没有变化,但是内在会出什么问题吗

CKP_1998 发表于 2020-5-24 17:26:41

Yth961102zxc 发表于 2020-4-16 16:47
一点疑问 如果这里把str3='\0'去掉 程序输出结果没有变化,但是内在会出什么问题吗

这个你可以通过调试观察一下str3的值,理论上没有str3='\0',最后一句除了To be,后面应该是输出乱码的

孤岛recwert 发表于 2021-1-6 10:04:38

{:10_303:}

2020.7.7 发表于 2021-2-2 12:32:32


{:10_336:}

2020.7.7 发表于 2021-2-2 12:36:36

dest = '\0';
这个判据484应该改为:
dest == '\0';

保护狗头{:10_267:}

1140913594 发表于 2021-2-18 16:08:51

讲得好

wwxjp 发表于 2021-4-20 22:45:20

2020.7.7 发表于 2021-2-2 12:36
dest = '\0';
这个判据484应该改为:
dest == '\0';


不对吧赋值的语句你改成判断了   条件表达式了

Cattle_L 发表于 2022-1-11 00:59:28

只要是关于str的函数,最后是不是都会自己加上'\0'

救赎自我- 发表于 2022-4-25 15:37:20

{:10_256:}

救赎自我- 发表于 2022-4-25 15:41:12

想知道 dest = '\0' 和dest = '\0' 有什么区别 我感觉在strncpy函数使用上后者才是对的啊{:10_316:}

早点退休 发表于 2022-10-11 12:08:56

dest = '\0';这个目的是啥我知道 但是这个是啥意思我到现在还不知道

一蓑烟雨@ 发表于 2023-3-19 14:17:51

Acacia 发表于 2020-2-15 21:21


{:5_97:}

hanghanga 发表于 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;
      char str3;
      char str4;

      strncpy(str2, str1, sizeof(str2));
      strncpy(str3, str2, 5);
      str3 = '\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

YuDai_Zhang 发表于 2024-7-6 21:46:39

2020.7.7 发表于 2021-2-2 12:36
**** 作者被禁止或删除 内容自动屏蔽 ****

在这里,应该没啥区别
页: [1]
查看完整版本: strncpy -- 拷贝字符串(受限)