当前位置:网站首页>秋招之路-经典面试题之手写字符串函数
秋招之路-经典面试题之手写字符串函数
2022-07-29 18:26:00 【51CTO】
[图]mac and coffe 2019-06-26
这是 herongwei 的第 69 篇原创
阅读本文大概需要 8 分钟
前言-手写代码必备手册
手写字符串处理相关函数是面试中极为常见的一类题。这里我将本人之前面试经历过的和网上高频的题目总结一下,希望能对你有所帮助。
经常面到的题目有以下几种:
1、strcpy;
2、strcat;
3、strcmp;
4、strstr;
5、memcpy;
6、memmove;
1、strcpy
函数作用:把 src 所指向的字符串复制到 dest。
注意:dest定义的空间应该比src大。
参考代码:
优化:
2、strcat
函数作用:把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
参考代码:
3、strcmp
函数作用:把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
该函数返回值如下:
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str1 大于 str2。
如果返回值 = 0,则表示 str1 等于 str2。
参考代码:
4、strstr
函数作用:在字符串 str1 中查找第一次出现字符串 str2 的位置,不包含终止符 '\0'。
参考代码:
5、memcpy
函数作用:模拟实现 memcpy 函数 从存储区 src 复制 n 个字符到存储区 dst。
参考代码(版本一):
注意了:面试中如问到 memcpy 的实现,那就要小心了,这里有陷阱。
先看下标准 memcpy() 的解释:
对于地址重叠的情况,该函数的行为是未定义的。
事实上所说的陷阱也在于此,自己动手实现 memcpy() 时就需要考虑地址重叠的情况,而我们上面第一版的代码中并没有考虑到地址重叠的问题!
测试代码
如果你身边有电脑,你可以试一下,你会发现输出并不是我们期待的“hhello,world!”(在“hello world!”前加个h)
而是“hhhhhhhhhhhhhh”!
这是什么原因呢?
仔细看下面这张图
原因就出在源地址区间和目的地址区间有重叠的地方!我相信,如果你反应足够快,马上会说那我从高地址开始拷贝不就行了么?
粗略地看,似乎能解决这个问题,虽然区间是重叠了,但是在修改以前已经拷贝了,所以不影响结果。但是仔细一想,这其实是犯了和上面一样的思维不严谨的错误,因为如果这样调用还是会出错:
所以比较推荐的解决方案还是判断源地址和目的地址的大小,才决定到底是从高地址开始拷贝还是低地址开始拷贝。
这个细节很重要!
其实,C 标准库也提供了地址重叠时的内存拷贝函数:memmove(),那么为什么还要考虑重写memcpy()函数呢?
原因在于:因为 memmove() 函数的实现效率问题,该函数把源字符串拷贝到临时 buf 里,然后再从临时 buf 里写到目的地址,增加了一次不必要的开销。
6、memmove
函数作用:相当于考虑内存重叠的 memcpy 函数,从存储区 src 复制 n 个字符到存储区 dst。
参考代码(版本二):
7、总结
常见的手写字符串函数就整理到这了,掌握这些知识点,不仅仅是为了准备面试,同时也要思考代码为什么要这样设计?
初写代码的时候,往往考虑的是程序正常工作的情况该怎么处理。当你有了几年经验,写了几万行代码后就会发现,处理异常部分的分支代码有时比正常的主干线代码还要多。
而这,也正是高质量程序和一般程序拉开差距的地方。如果把软件产品当作一台机器,那么这样一个个细小的函数和类就是零部件,只有当这些零部件质量都很高时,整个软件产品的质量才会高。
今天的知识点,你掌握了吗?
欢迎和我一起交流~
原创不易
点个呗
边栏推荐
- The backslash \\ in MySQL is really a pit
- 不惧AMD及Arm挑战,英特尔称霸服务器市场的秘诀是什么?
- 实现一个可调节大小的 Switch 开关
- Security整各Gateway后配置不生效?
- MarkBERT
- 原理银行一直在收我利息!!!
- Frame双向通信插件FrameDataTrans
- PX4模块设计之十四:Event设计
- R语言ggplot2可视化绘制条形图(bar plot)、使用gghighlight包突出高亮条形图中的特定条形(highlight specific bar plot)
- R语言时间序列数据提取:使用xts包的first函数提取时间序列中最前面一个月的数据(first 1 month)
猜你喜欢
随机推荐
MySQL数据库的七种约束语法格式和使用详解&约束的总结
Word Embedding与Word2Vec学习
虚拟偶像的歌声原来是这样生成的!
字节跳动使用 Flink State 的经验分享
每日优鲜“坠落”,生鲜前置仓的面子和里子
谈谈如何建立价值驱动的数据战略
String类型_static成员_动态内存分配_拷贝构造函数_const关键字_友元函数与友元类
Security whole configuration does not take effect after the Gateway?
无人驾驶技术有什么优点,人工驾驶的优缺点英文
R语言时间序列数据提取:使用xts包的first函数提取时间序列中最前面一个月的数据(first 1 month)
AI 通过了图灵测试,科学家反应冷淡:“很棒,但没必要”
Thread、Runnable、Callable、Future ... 的关系?
整体系统地认识网络安全与发展
会议OA项目之待开会议&&所有会议功能
【学习笔记】NOIP模拟赛
R语言时间序列数据提取:使用xts包的last函数提取时间序列中最后面两周的数据(last 2 week)
制作文件上传进度条
For key in object traversal of objects encountered problems
牛客网刷题记录 || 指针
平行坐标图:高维数据可视化必备图形