strlen、strcpy和strcmp源码
1、不使用库函数实现strcpy
#include <assert.h>
char *strcpy(char *dst, const char *src)
{
assert((dst != NULL) && (src != NULL));
char *tmp = dst;
while ((*dst++ = *src++) != '\0')
{ /* nothing */;
}
return tmp;
}
需要注意几个方面的问题:
1、注意编程风格。比如,使用dst、src这样增强可读性的名字。
2、使用断言assert来检验输入参数的有效性。
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回false,则终止程序执行。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁
用断言。
3、使用const来约束src,表明src对应的内容不能被修改。
4、返回dst,以便实现链式表达式这样的机制。
2、strlen函数源码
size_t strlen_b(const char * str)
{
const char *cp = str;
while (*cp++ );
return (cp - str - 1 );
}
3、微软strcmp函数源码
int __cdecl strcmp (const char *src, const char *dst)
{
int ret = 0 ;
while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
{
++src; ++dst;
}
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
4、面试中strcpy源码的判分标准
如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分
|
void strcpy( char *strDest, char *strSrc ) { while( (*strDest++ = * strSrc++) != ‘\0’ ); } |
4分
|
void strcpy( char *strDest, const char *strSrc ) //将源字符串加const,表明其为输入参数,加2分 { while( (*strDest++ = * strSrc++) != ‘\0’ ); } |
7分
|
void strcpy(char *strDest, const char *strSrc) { //对源地址和目的地址加非0断言,加3分 assert( (strDest != NULL) &&(strSrc != NULL) ); while( (*strDest++ = * strSrc++) != ‘\0’ ); } |
10分
|
//为了实现链式操作,将目的地址返回,加3分! char * strcpy( char *strDest, const char *strSrc ) { assert( (strDest != NULL) &&(strSrc != NULL) ); char *address = strDest; while( (*strDest++ = * strSrc++) != ‘\0’ ); return address; } |
从2分到10分的几个答案我们可以清楚的看到,需要多么扎实的基本功才能写一个完美的strcpy。
5、对strlen的掌握,它没有包括字符串末尾的'\0'
看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为:
|
int strlen( const char *str ) //输入参数const,2分 { assert( strt != NULL ); //断言字符串地址非0,3分 int len; while( (*str++) != '\0' ) // 3分 { len++; } return len; } |
strlen、strcpy和strcmp源码的更多相关文章
- 字符串操作函数<string.h>相关函数strcpy,strcat,等源码。
首先说一下源码到底在哪里找. 我们在文件中包含<cstring>时,如果点击右键打开文档, 会打开cstring,我们会发现路径为: D:\Program Files\visual stu ...
- strlen(); strcpy(); strcat(); strcmp() ---笔记
指针小知识点: int a =10; int *p=&a; int *q=p; //p中保存的是a的地址 int *q=p; //将p的值赋给q 作用是让q也指向a ...
- 实现strlen,strcpy,strcat,strcmp同功能的函数stringLength,stringCopy,stringCatch,stringCompare
#import <Foundation/Foundation.h> /* 求字符串长度 */ int stringLength(char arr[]); /* 复制字符串 将arr1 复制 ...
- strcmp的源码实现
微软方法: int __cdecl strcmp (const char *src, const char *dst) { ; while(!(ret = *(unsigned char *)src ...
- [PHP源码阅读]strlen函数
文章来自:http://www.hoohack.me/2016/02/22/phps-source-analytics-strlen 我在github有对PHP源码更详细的注解.感兴趣的可以围观一下, ...
- 库函数strlen源码重现及注意问题
首先直接上源码: size_t strlen (const char * str) { const char *eos = str; while(*eos++); return(eos - str - ...
- strlen源码剖析
学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效.恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简 ...
- C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码
extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h> 功能:由src所指内存 ...
- 源码实现 --> strcmp
比较字符串大小 函数 int strcmp(const char *string1, const char *string2); 比较字符串string1和string2大小. 返回值< 0, ...
随机推荐
- python(列表推导式和生成器表达式)
从母鸡下蛋的故事讲起 老母鸡 = ('鸡蛋%s'%i for i in range(10)) print(老母鸡) for 蛋 in 老母鸡: print(蛋) g = (i*i for i in r ...
- Android ROM 开发技能图谱
# Android ROM 开发技能图谱 ## 1. 操作系统 * Ubuntu(首选)* MacOSX ## 2. 编程语言 * Java * JNI(务必掌握)* C++* C ## 3. 源码 ...
- 如何用QTP录制鼠标右键点击事件
QTP录制鼠标右键单击事件要通过模拟键盘操作来实现 Step 1,修改ReplayType为2,一般情况默认设置是1的.(1 – 使用浏览器事件运行鼠标操作. 2 – 使用鼠标运行鼠标操作)Setti ...
- linux 之文件重命名
没有专门的重命名 命令 用 mv a b 就可以重命名了 mv :move 移动文件(延伸功能:重命名,linux系统没有专门的重命名命令) 基本格式: 移动文件:mv 文件名 移动目的地文件名 重命 ...
- vue aliasConfig(模块别名配置)
今天研究了下鹏哥搭建的项目代码,一个人捣鼓了半天模块别名配置,边写边测试,才慢慢明白,所有写下来当个笔记: 在vue项目中,经常根据需要引入不同的功能模块,默认情况下我们通过代码 import mod ...
- mavenFailed to execute goal org.apache.maven.plugins:maven-surefire-plugin解决方法
在项目上右键==>属性==>java构建路径==>源代码,然后把几个文件夹全部删除,然后再添加文件夹中把它们从新添加,然后再maven intall,部署.
- teb教程3
配置和运行机器人导航 简介:配置teb_local_planner作为navigation中local planner的插件 参考teb安装 由于局部代价地图的大小和分辨率对优化性能影响很大,因为占据 ...
- windows系统exe文件图标变成了白色无图标
转载:https://blog.csdn.net/whatday/article/details/52658412 在命令提示符下输入下列命令即可恢复. 按键 “WIN+R” 输入即可cmd ...
- shell script test指令的测试功能 &和&&,|和|| 区别 变量名赋值=号前后的空格问题(天坑)
小程序告一段落,达到阶段性目标.下一步继续Linux的学习....脑子不够用啊...真费... 书中介绍..检测系统某些文件或者相关属性时,用test指令.. 例如.测试某个文档目录是否存在可以 t ...
- Navicat定时 同步数据库
转载:https://www.cnblogs.com/DFX339/p/11646812.html 我是用在了 mysql 和 sql server 数据同步(操作一模一样) 好文章,简单粗暴.适合我 ...