深入理解strncpy这个函数
1.不考虑内存重叠的strncpy
- char *strncpy(char *dst, const char *src, size_t len)
- {
- assert(dst != NULL && src != NULL);
- char *res = dst;
- while (len--)
- {
- *dst++ = *src++;
- }
- return res;
- }
看着好像没啥问题,但是,当src的长度小于len呢?这份代码没有处理这个问题。当src的长度小于len时,应该如何处理?《C和指针》p179给出的答案是:
- char *strncpy(char *dest, const char *src, size_t len)
- {
- assert(dest != NULL && src != NULL);
- char *res = dest;
- int offset = 0;
- if (strlen(src) < len)//src长度小于len
- {
- offset = len - strlen(src);
- len = strlen(src);
- }
- while (len--)
- {
- *dest++ = *src++;
- }
- while (offset--)
- {
- *dest++ = '\0';
- }
- return res;
- }
- char message[] = "abcd";
- strncpy(message, "abcde",5);
- cout << message;
输出是abcde烫烫烫烫烫烫烫烫烫烫烫烫烫烫 (结果不唯一)
message的内存是有5个字节的,但是将abcde拷贝过去时,最后面的‘\0’被覆盖了,strncpy并不会负责添加‘\0’到dst结尾,因此,输出该字符串是,会在e字符后面一直找到‘\0’才结束,因此就会出现乱码。
2.考虑内存重叠的strncpy
面试中经常会遇到让你写一个能够处理内存重叠的strncpy,标准库中的strncpy是不考虑内存重叠的,如果出现内存重叠,结果将是未定义的。
- char *strncpy(char *dst, const char *src, size_t len)
- {
- assert(dst != NULL && src != NULL);
- char *res = dst;
- if (dst >= src && dst <= src + len - 1)//重叠,从后向前复制
- {
- dst = dst + len - 1;
- src = src + len - 1;
- while (len--)
- *dst-- = *src--;
- }
- else
- {
- while (len--)
- *dst++ = *src++;
- }
- return res;
- }
- char *strncpy(char *dst, const char *src, size_t len)
- {
- assert(dst != NULL && src != NULL);
- char *res = dst;
- int offset = 0;
- char *tmp;
- if (strlen(src) < len)//src长度小于len
- {
- offset = len - strlen(src);
- len = strlen(src);
- }
- if (dst >= src && dst <= src + len - 1)//重叠,从后向前复制
- {
- dst = dst + len - 1;
- src = src + len - 1;
- tmp = dst;
- while (len--)
- *dst-- = *src--;
- }
- else
- {
- while (len--)
- *dst++ = *src++;
- tmp = dst;
- }
- while (offset--)
- {
- *tmp++ = '\0';
- }
- return res;
- }
那么,如果len的值大于dst的值,就会破坏dst后面的内存空间,这应该是要避免的。
- char buffer[BSIZE];
- .
- .
- strncpy(buffer,name,BSIZE);
- buffer[BSIZE-1]='\0';
深入理解strncpy这个函数相关推荐
- python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递
python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...
- 深入浅出理解c++虚函数
深入浅出理解c++虚函数 记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数竟然不太确定,所以还是理解的不深刻,所以想通过这篇文章来巩固下. 装逼一刻: 最近,本人思想发生了 ...
- 理解javascript 回调函数
理解javascript 回调函数 原文:理解javascript 回调函数 ##回调函数定义 百度百科:回调函数 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一 ...
- 深入理解C++重载函数
深入理解C++重载函数 1.定义:C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或者顺序)必须不同,即函数的参数列表不同,也就是说用同一个运算符完成不 ...
- Linux底层IIC 总线的理解、调用函数以及常见面试问题
对 IIC 总线的理解.调用函数以及常见面试问题 一.IIC 总线概述: IIC 即Inter-Integrated Circuit(集成电路总线) I2C总线是PHLIPS公司推出的一种串行总线, ...
- 简单理解 柯理化函数
理解柯理化函数: 1. 是函数 2. 接受多个参数(一个参数没必要用柯理化) 3. 将 接受多个参数 的函数变成 接受一个参数 的函数(函数嵌套),每个函数返回一个新函数并接受一个新的参数,直到最后返 ...
- 如何理解python中的函数_如何理解“python中函数是一等公民”?
python.js.scala等支持函数式编程的语言中,是如何体现"函数是一等公民(first class)"的?而在c/c++.java等静态语言中的一等公民又是什么?如何体现的 ...
- c语言 字符串 strncpy,详解c语言中的 strcpy和strncpy字符串函数使用
详解c语言中的 strcpy和strncpy字符串函数使用 strcpy 和strcnpy函数--字符串复制函数. 1.strcpy函数 函数原型:char *strcpy(char *dst,cha ...
- 《C语言杂记》理解字符串处理函数 strlen() strcpy() strcat() strcmp()
在linux C 编程中,我们经常遇到字符串的处理,最多的就是字符串的长度.拷贝字符串.比较字符串等:当然现在的C库中为我们提供了很多字符串处理函数.熟练的运用这些函数,可以减少编程工作量,这里介绍几 ...
最新文章
- 关于bitmap,为什么android会有bitmap
- 【 FPGA 】UltraFast设计方法学:在Vivado中使用设计规则检查
- 20.17 shell中的函数
- java轻量级并行工具类_16 个超级实用的 Java 工具类
- struts2从action向jsp传参数
- .xyz文件_Orca.xyz:除了银行系统瑞士还有同样安全的数字保险箱
- 中国计算机学会推荐国际学术期刊--数据库/数据挖掘/内容检索
- java指标计算_java – 使用JMH计算指标
- error LNK2019: 无法解析的外部符号 main,函数 “int __cdecl __scrt_common_main_seh(void)“ (?__scrt_common_main_seh
- 出入机房计算机无登记表,三峡大学机房维护管理制度
- M1 Macbook安装MATLAB
- 苹果Mac怎样清除dns缓存?
- 基于JavaEE的健身房管理系统的设计
- MSF-17010(永恒之蓝)复现
- 【ChatGPT模板】教学辅助教案篇
- 认识Base64,看这篇足够了
- 基于验证分离的PLC保护系统
- FreeEIM 网站地图 A
- 使用示波器学习变压器
- 安卓终端神器Termux (后面还有Termux常用的快捷键,妥妥干货分享,记得点赞收藏哦!)