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源码的更多相关文章

  1. 字符串操作函数<string.h>相关函数strcpy,strcat,等源码。

    首先说一下源码到底在哪里找. 我们在文件中包含<cstring>时,如果点击右键打开文档, 会打开cstring,我们会发现路径为: D:\Program Files\visual stu ...

  2. strlen(); strcpy(); strcat(); strcmp() ---笔记

    指针小知识点: int a =10; int *p=&a; int *q=p;        //p中保存的是a的地址 int *q=p;       //将p的值赋给q 作用是让q也指向a ...

  3. 实现strlen,strcpy,strcat,strcmp同功能的函数stringLength,stringCopy,stringCatch,stringCompare

    #import <Foundation/Foundation.h> /* 求字符串长度 */ int stringLength(char arr[]); /* 复制字符串 将arr1 复制 ...

  4. strcmp的源码实现

    微软方法: int __cdecl strcmp (const char *src, const char *dst) { ; while(!(ret = *(unsigned char *)src ...

  5. [PHP源码阅读]strlen函数

    文章来自:http://www.hoohack.me/2016/02/22/phps-source-analytics-strlen 我在github有对PHP源码更详细的注解.感兴趣的可以围观一下, ...

  6. 库函数strlen源码重现及注意问题

    首先直接上源码: size_t strlen (const char * str) { const char *eos = str; while(*eos++); return(eos - str - ...

  7. strlen源码剖析

      学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效.恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简 ...

  8. C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码

    extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h>   功能:由src所指内存 ...

  9. 源码实现 --> strcmp

    比较字符串大小 函数 int strcmp(const char *string1, const char *string2); 比较字符串string1和string2大小. 返回值< 0,  ...

随机推荐

  1. Node.js 开发技能图谱

    # Node.js 开发技能图谱 ## Node.js 语言环境搭建 - Node.js 安装(3m大法:nvm.npm.nrm)- Node.js 命令- Node.js开发工具(推荐vscode) ...

  2. 在IIS7以上导出所有应用程序池的方法批量域名绑定(网站绑定)

    在IIS7+上导出所有应用程序池的方法: %windir%/system32/inetsrv/appcmd list apppool /config /xml > c:/apppools.xml ...

  3. 百度上有个最难数独, 用python跑它

    直接上代码 #!/usr/bin/python3 #coding=GB2312 import tkinter as tk import threading import time import ran ...

  4. 5. 使用grafana模板

    我们刚刚配置的Dashboard还是有点简陋,为了界面美观,这里我们这里使用一些模板 1.使用node_exporter模板 去grafana官网下载模板,点击Download,如下所示 2.导入模板 ...

  5. Django 同步数据库的时候app中的models的表没有成功创建

    出现  no  changes detected python3 manage.py makemigrations --empty blog # blog就是你的app名字,此处要写成自己的app名字 ...

  6. jmeter 函数学习

    https://jmeter.apache.org/usermanual/functions.html#__threadNum

  7. VMware新建虚拟机之后的初始化工作

    一.开启网络功能(后面的ifcfg-ens33自身系统不同) vi /etc/sysconfig/network-scripts/ifcfg-ens33 ONBOOT=yes systemctl re ...

  8. 关于JDK,tomcat,eclipse的配置

    1.下载安装JDK 在自定义安装路径时,jdk和之后的jre文件夹是属于平行结构,我的安装路径为:D:\jdk\jdk1.6.0_43和D:\jdk\jre6 然后是对环境变量的配置, 计算机→属性→ ...

  9. css图片文字

    1.浏览器是把 html 和 css 一起下载并执行的,计算机里把两件事情同时做  异步加载.计算机中的同步异步和我们生活中的正好是相反的. 补充: 同步,是所有的操作都做完,才返回给用户结果.即写完 ...

  10. Vs 中的智能提示,默认选中,切换快捷键

    切换是否默认选中,快捷键: Ctrl+Alt+Space(空格)