现在的位置: 首页 > 综合 > 正文

常见C语言字符串函数

2018年05月02日 ⁄ 综合 ⁄ 共 4431字 ⁄ 字号 评论关闭

      额,据说,在面试的时候经常会出现要我们实现字符串函数的题目,话还说这些题目其实很简单,主要考的是面试者的代码风格和考虑问题的严谨性。偶要是没看到有些面试题目考这些字符串函数,偶估计就不会用C语言去实现这些函数了,因为觉得,库函数都已经有了干嘛还要去写呢?呵呵,后来,自己去试着写库函数,和网上的一些大牛写的库函数一比较……惭愧啊。可笑的是,在试着写库函数的过程中,有个库函数连自己的测试数据都过不了,更可笑的是,我现在还没有找到究竟哪个地方错了。嗯嗯,开始贴我写的库函数的代码。以后觉得该写的字符创库函数都慢慢加到这篇博文上面来吧。

 

 

 

      额,接下来的这个strcpy字符串函数据说是考的最多的一个。其实呢,偶一直使用的是C++,C++有个string类,里面重载了很多操作符,用起来感觉比C语言的字符串函数爽多了。所以对于C语言的的字符串函数不甚了解,我在写这篇博文的时候,都是先去查一下函数的使用方法,才来写的,不过在写的过程中出了很多问题。嗯嗯,贴我写的strcpy函数的代码:

      OK,你一定看到了我在我写的strcpy函数后面注释了A,B,C吧。额,没看见也没事啦。声明一下,下面的内容是从百度上面Copy的,非原创。但我觉得说的很好,所以……偶就Copy过来了。

      错误的写法:
     【A】
      ①:不检查指针的有效性,说明答题者不注重代码的健壮性。
      ②:(B)检查指针的有效性时使用if((!strDest)||(!strSrc))或if(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false 三个关键字以提供更安全的条件表达式。
    ③检查指针的有效性时使用if((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器 不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。

     【B】
      ①:忘记保存原始的strDest值,说明答题者逻辑思维不严密。

     【C】
      ①循环写成while (*strDest++=*strSrc++);,同[A](2)。
    ②循环写成while (*strSrc!='/0') *strDest++=*strSrc++;,说明答题者对边界条件的检查不力。循环体结束后,strDest字符串的末尾没有正确地加上'/0'。
      然后,还有可能要我们解释为什么要返回char *。这个倒是不难,返回strDest的原始值使函数能够支持链式表达式,增加了函数的“附加值”。同样功能的函数,如果能合理地提高的可用性,自然就更加理想。
  链式表达式的形式如: int iLength=strlen(strcpy(strA,strB)); 又如:char * strA=strcpy(new char[10],strB); 返回strSrc的原始值是错误的。其一,源字符串肯定是已知的,返回它没有意义。其二,不能支持形如第二例的表达式。其三,为了保护源字符串,形参用 const限定strSrc所指的内容,把const char *作为char *返回,类型不符,编译报错。

 

    好的,strcpy到此结束,我们来看下一个常用的字符串函数strcmp。

    嗯,直接See My Code About strcmp吧。

      嗯,写代码的过程中我终于明白了返回值<0,返回值>0了,呵呵。我相信你也应该明白了。

 

      接下来写个比较简单的字符串函数:strlen.既然比较简单,那就多写几个strlen的版本。偶直接就贴代码了。

 

 

抱歉!评论已关闭.