strncpy:字串复制

原创 2011年01月15日 19:35:00

原型:char * strncpy(char *dest, char *src, size_t n);

  功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。

  说明:

  如果n > dest串长度,dest栈空间溢出产生崩溃异常。

  否则:

  1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)

  如果n=(0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。

  如果n = src串长度,与strcpy一致。

  如果n = dest串长度,[0,src串长度]处存放src字串,(src串长度, dest串长度]处存放NULL。

  2)src串长度>dest串长度

  如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。

  综上,一般情况下,使用strncpy时,建议将n置为dest串长度(除非你将多个src串都复制到dest数组,并且从dest尾部反向操作),复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生在第2)种情况下的输出乱码问题。当然喽,无论是strcpy还是strncpy,保证src串长度<dest串长度才是最重要的。

strncpy的一种实现方式

char * strncpy(char* dest, const char* src, int n){

  char c;

  char *s = dest;

  if (n >= 4)

  {

  size_t n4 = n >> 2;

  for (;;)

  {

  c = *src++;

  *dest++ = c;

  if (c == '/0')

  break;

  c = *src++;

  *dest++ = c;

  if (c == '/0')

  break;

  c = *src++;

  *dest++ = c;

  if (c == '/0')

  break;

  c = *src++;

  *dest++ = c;

  if (c == '/0')

  break;

  if (--n4 == 0)

  goto last_chars;

  }

  n -= dest - s;

  goto zero_fill;

  }

  last_chars:

  n &= 3;

  if (n == 0)

  return s;

  for (;;)

  {

  c = *src++;

  --n;

  *dest++ = c;

  if (c == '/0')

  break;

  if (n == 0)

  return s;

  }

  zero_fill:

  while (n-- > 0)

  dest[n] = '/0';

  return s;

  }

机房收费系统文档

前提:        好的开始是成功的一半。谨遵师傅教导:做一件事情之前进行宏观把握,了解全局,这便是编写文档成功的一半。 过程:      整个机房收费系统文档的成功编写历时大约10天的时间,...
  • yxf15732625262
  • yxf15732625262
  • 2015年11月04日 18:20
  • 928

《Angular路由跳转之指令跳转》

随着ITOO项目的深入,前端框架Angular的应用也在不断加深,路由的跳转分为两个部分,一个是代码跳转,另外一个是指令跳转。此篇是继上次代码跳转的姊妹篇。接下来请听小编娓娓道来。...
  • yxf15732625262
  • yxf15732625262
  • 2017年07月30日 23:00
  • 580

strncpy拷贝问题而引发的一些讨论

背景:对一块string对象进行拷贝到char数组的时候发现数据缺失了。分析:由于在拷贝的时候使用的是strncpy,而strncpy在复制的时候,在遇到’\0’时,先复制过去,然后的把dest剩下置...
  • ljp1919
  • ljp1919
  • 2017年06月23日 20:45
  • 651

【投资与创业】【搭建 Alexa 语音服务】【Java 面试】| Chat · 预告

1投资与创业:程序猿如何改变世界作者简介:丹华,最早押注比特币的分析师,《区块链数字货币投资指南》一书作者(合著),域名 smartcontract.org 拥有者(寻购买或合作伙伴)。2013年开始...
  • GitChat
  • GitChat
  • 2017年12月21日 00:00
  • 545

【Windows 程序设计】【校招中常见的算法】【TensorFlow】【前端数据结构】| Chat · 预告

1 Windows 程序设计精髓:从 API、UI、结构到商业产品 作者简介: 范蠡,资深开发工程师,csdn认证博客技术专家,曾担任多个商业项目的客户端和服务器端主程、架构...
  • GitChat
  • GitChat
  • 2017年11月20日 00:00
  • 187

你为什么要努力?

近日以来,新闻上的南海问题成了每日的头条,各个空间动态微博动态朋友圈里也都在转发着南海属于中国,一霎间,所有人都成了忠贞无比、爱国的热血青年,南海问题不仅仅是领土争端的问题,主权问题的背后更是国家之间...
  • YYZZHC999
  • YYZZHC999
  • 2016年07月15日 10:33
  • 1220

C/C++笔记--strcpy和strncpy函数的安全性分析

两者都是C/C++里面的字符串拷贝函数,不同的是后者多了一个参数,此参数可以指定从源拷贝多长。char* strcpy(char* strDest, const char* strSrc) char*...
  • ZH___xin
  • ZH___xin
  • 2016年07月21日 18:35
  • 488

关于strncpy这个函数

1.不考虑内存重叠的strncpy 网上很多博客也写了这个函数,面试也常常会遇到,但是,我发现网上的很多代码都是有问题的,我们先看下大部分网上博客的实现: char *strncpy(char *ds...
  • sinat_30071459
  • sinat_30071459
  • 2017年05月27日 10:07
  • 447

C语言之strncpy函数

【FROM MSDN && 百科】 原型:char * strncpy(char *dest, char *src, size_t n); #include 功能:将字符串src中最...
  • hgj125073
  • hgj125073
  • 2013年01月04日 15:27
  • 7044
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:strncpy:字串复制
举报原因:
原因补充:

(最多只允许输入30个字)