`
wcb2003
  • 浏览: 59487 次
  • 性别: Icon_minigender_1
  • 来自: zhengzhou
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

程序员编程艺术:第四章、现场编写类似strstr/strcpy/strpbrk的函数

 
阅读更多

第四章、现场编写类似strstr/strcpy/strpbrk的函数

作者:July。
说明:如果在博客中代码使用了\n,csdn blog系统将会自动回给我变成/n。据后续验证,可能是原来旧blog版本的bug,新版已不存在此问题。至于,本文代码,日后统一修正。July、2012.05.02。
微博:http://weibo.com/julyweibo
出处:http://blog.csdn.net/v_JULY_v
wiki:http://tctop.wikispaces.com/
----------------------------------------------


前奏

有网友向我反应,之前三章(http://t.cn/hgVPmH)的面试题目,是否有点太难了。诚如他所说,绝大部分公司的面试题不会像微软等公司的面试题目出的那么变态,或复杂。

面试考察的是你对基础知识的掌握程度,及编程能力是否过硬的一种检测,所以,扎实基础知识,提高编程能力,比去看什么所谓的面经,或去背面试题目的答案强多了。

很多中、小型公司自己的创造能力,包括人力,物力资源都有限,所以,他们的面试题目除了copy一些大公司的题库之外(当然,考察你对基础知识的掌握情况,是肯定不会放过的),还有一个途径就是让你在限定时间内(如十分钟),当场实现一些类似strcpy/strcat/strpbrk等库函数,这个主要看你对细节的把握,以及编程能力是否之扎实了。

同时,本章里出现的代码(除了第4节的c标准库部分源码)都是个人限定在短时间内(正好,突出现场感)编写的,很多问题,难免有所考虑不周。所以,如果你发现本章任何一段代码有任何问题,恳请不吝指正。


第一节、字符串查找
1.1题目描述:
给定一个字符串A,要求在A中查找一个子串B。
如A="ABCDF",要你在A中查找子串B=“CD”。

分析:比较简单,相当于实现strstr库函数,主体代码如下:

读者反馈@xiaohui5319:楼主啊,对于你那个strstr的函数,我觉得有点小问题。我查了一下C标准库的源码,它给的声明是这样的,两个参数都有const。

char *

STRSTR (const char *haystack_start, const char *needle_start)

而且标准库中没有调用strlen函数,因为假如你是标准库的设计者,strlen()函数还没设计出来,你怎么去计算两个字符串的长度?是不是只能通过指针移动来实现,我觉得这些都是微软要考察的地方。

此外:还有int lenstr=strlen(string);这是不安全的?
strlen函数的返回类型是size_t型,也就是无符号整型,假如我的数组长度很长(假如是用堆分配的,可以很大很大),长过2的31次方减1的话,会发生一处,你这lenstr就会变成负值了
用size_t类型最保险。

以后,本编程艺术系列中有任何问题,暂未来得及及时修正,请读者多加思考,多加辨明

上述程序已经实现了在字符串中查找第一个子串的功能,时间复杂度为O(n*m),也可以用KMP算法,复杂度为O(m+n)。为人打通思路,提高他人创造力,我想,这是狂想曲与其它的面试解答所不同的地方,也是我们写狂想曲系列文章的意义与价值之所在。

1.2、题目描述

在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。

代码则可以如下编写:

代码二,bitmap:

第二节、字符串拷贝
题目描述:
要求实现库函数strcpy,
原型声明:extern char *strcpy(char *dest,char *src);
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。  
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。  
返回指向dest的指针。

分析:如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案

第三节、小部分库函数的实现
考察此类编写同库函数一样功能的函数经常见于大大小小的IT公司的面试题目中,以下是常见的字符串库函数的实现,希望,对你有所帮助,有任何问题,欢迎不吝指正:


测试:以上所有的函数,都待进一步测试,有任何问题,欢迎任何人随时不吝指出。

第四节、c标准库部分源代码

为了给各位一个可靠的参考,以下,我摘取一些c标准框里的源代码,以飨各位:

有关狂想曲的修订

程序员面试题狂想曲-tctop(the crazy thinking of programers)的修订wiki(http://tctop.wikispaces.com/)已于今天建立,我们急切的想得到读者的反馈,意见,建议,以及更好的思路,算法,和代码优化的建议。所以,

  • 如果你发现了狂想曲系列中的任何一题,任何一章(http://t.cn/hgVPmH)中的错误,问题,与漏洞,欢迎告知给我们,我们将感激不尽,同时,免费赠送本blog内的全部博文集锦的CHM文件1期;
  • 如果你能对狂想曲系列的创作提供任何建设性意见,或指导,欢迎反馈给我们,并真诚邀请您加入到狂想曲的wiki修订工作中;
  • 如果你是编程高手,对狂想曲的任何一章有自己更好的思路,或算法,欢迎加入狂想曲的创作组,以为千千万万的读者创造更多的价值,更好的服务。
    Ps:狂想曲tctop的wiki修订地址为:
    http://tctop.wikispaces.com/。欢迎围观,更欢迎您加入到狂想曲的创作或wiki修订中。

版权所有,本人对本blog内所有任何内容享有版权及著作权。实要转载,请以链接形式注明出处。

分享到:
评论

相关推荐

    strstr和strcpy函数实现

    strstr函数和strcpy函数的简单实现

    CentOS7.2.1511 gcc4.8.5 通过编译的 tfs2.2.16

    char* pos = strstr(sub_dir, parents_dir); 解决:添加编译参数-fpermissive [root@localhost tfs_release-2.2.16]# vim src/name_meta_server/Makefile CXXFLAGS = -g -D__STDC_LIMIT_MACROS -Wall -Wextra -...

    C++中strstr函数的实现方法总结

    C++中strstr函数的实现方法总结 函数说明: 包含文件:string.h 函数名: strstr 函数原型:extern char *strstr(char *str1, char *str2); 功能:从字符串str1中查找是否有字符串str2, 如果有,从str1中的str2...

    LeetCode最全代码

    18| [4 Sum](https://leetcode.com/problems/4sum/) | [C++](./C++/4sum.cpp) [Python](./Python/4sum.py) | _O(n^3)_ | _O(1)_ | Medium || Two Pointers 26 | [Remove Duplicates from Sorted Array]...

    -C++参考大全(第四版) (2010 年度畅销榜

    第4章 数组和以null结束的字符串 4.1 一维数组 4.2 生成指向数组的指针 4.3 向函数传递一维数组 4.4 以null结束的字符串 4.5 二维数组 4.6 多维数组 4.7 带下标的指针 4.8 数组初始化 4.9 棋盘游戏实例 第5章 指针 ...

    C++ VC strstr函数的仿真

    C++ VC strstr函数的仿真

    类C语言的脚本解析执行(使用C++语言编写)20080625

    本组建主要用于在程序中解析预先编写的类C脚本,并依据脚本执行,可通过调用外部指针函数读入输入变量执行计算,最终得出计算结果写入输出变量中;用户可通过读取输出变量获取最终的结果。 脚本中可调用函数,函数...

    C字符串查找优化,strstr函数查找无中文汉字问题

    C strstr字符串查找函数优化,解决查找中文汉字匹配存在错误BUG问题。支持GBK、GB18030字符串。

    Quectel_LTE&5G_USB_Driver_V2.1.zip

    strcpy(sysport, pchar + 1); snprintf(syspath, sizeof(syspath), "/sys/bus/usb/devices/%s/idVendor", sysport); fd = open(syspath, O_RDONLY); if (fd ) { qlog_dbg("Fail to open %s, errno: %d ...

    字符串函数总结

    参考字符串函数,有strstr strcat strcpy strcmp等

    php字符串函数学习之strstr()

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。 该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。 语法 string strstr ( string, search) 参数 描述 string 必需...

    实现strstr()函数1

    示例 1:输出: 2示例 2:输出: -1int strStr(char * haystack, char * needle){//该指针记录每一次进行匹配的起

    LeetCode 28. 实现 strStr()

    实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack = "hello", needle = ...

    strcmp,strstr,strcat,strcopy等函数源代码

    本人简单的写一写代码,给需要看的人一个参考。欢迎高手拍砖,想交流的我的联系方式都是里面,可以交流一下,共同进步。

    C语言函数速查手册

    C语言常见的函数速查 字符串函数 bcmp bcopy bzero memccpy memchr memcmp memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn strdup ...

    strstr()函数的局限

    【strstr()函数的局限】strstr()检测不到存在的字符/数据/strcmp, strncmp和memcmp。

    Java程序员要知道的C/C++函数

    (1)函数原型:extern char strstr(char *haystack,char *needle);  用法:#include  功能:从字符串haystack中寻找needle第一次出现的位置(不比较结束符NULL)返回指向第一次出现needle位置的指针,如果没有...

    C语言函数库函数详细介绍手册

    C语言常用函数库详细的使用说明 字符串函数 bcmp bcopy bzero memccpy memchr memcmp memcpy memicmp memmove memset movmem setmem stpcpy strcat strchr strcmp strcmpi strcpy strcspn ...

    strstr,strdup,strsep 三函数实现

    strstr,strdup,strsep 三函数实现

    C语言分别实现strcpy,strcmp,strlen,strcat,strchr,strstr的功能

    C语言分别实现strcpy,strcmp,strlen,strcat,strchr,strstr的功能

Global site tag (gtag.js) - Google Analytics