关于字符串的操作函数有很多,那么在众多的函数中是否有一个共通的地方。下面简略分析一下。

  目前,我在学习中碰到的字符串操作函数有:strlen,strcat,strcpy,strcmp;

  那么我们按照上面的顺序一一介绍一下。

  1.strlen

strlen 是求取字符串长度的函数;其原型为:size_t strlen( const char *string );


   实现:int strlen(const char *string)

       {

          assert(string);//对指针的有效性进行检测

          int count=0;

          while(*string++)  //相当于(*string != '\0')

         {

           count++;   

          }

         return count;

       }

    在实现部分有几点,我认为可以加分的选项。

    1).const字符的使用,避免了在函数内部不小心改掉字符串的值。

    2).assert—指针有效性的检查。

    作为初学者,在学习这一部分的时候,应该看看编译器中的源码是怎么实现这些函数的和函数的 原型是什么以及函数的返回值是什么。以便于我们在自己实现这些函数的时候,不会手足无措。

    2.strcat

    作为字符串追加函数,完成的是将源(src)追加到目标(dest)上。那么,让我们看看strcat的原型,char *strcat( char *strDestination, const char *strSource );

    实现代码:

     char *my_strcat(char *dest, const char *src)

    {

    assert(dest);

    assert(src);

    char *ret = *dest;

    while (*dest)

    {

     dest++;

    }

    while (*dest++ = *src++)

    {

;

    }

    return ret;

    }

   同样,在这个函数中有几点,需要注意。

   1).const assert这些就不再啰嗦了。

   2).char * 作为函数的开头是为了有一个链式访问。

   3).在目标字符串遍历指向'\0'的代码中,不可以这样写.str

     while(*dest++)

    {

       ;

    }    

让我们试着分析一下,后置++在*dest为'\0'的时候,dest还往后面内存偏移了一块空间。那么,会造成什么结果呢?

    eg:将字符串" to xian!"追加到字符串"welcome"的后面。由于*dest指向了'\0'后面的位置,那么在输出的时候,只会输出welcome。

   4).上述代码中追加部分,已经将'\0'拷贝进去了。

   5).这点要说的是我在才开始犯的错误,是在主函数中。看看主函数的代码。

    

        int main()

        {

         char str1[] = "welcome";

         char str2[] = " to xian";

         my_strcat(str1, str2);

         printf("%s", str1);

         system("pause");

         return 0;

        }

    当在vs2013中运行,会出现奔溃。

    试着分析一下原因。在主函数加载内存的时候,为str1分配了8个字节的大小(我把"\0"也算进去),当你字符串追加的时候,要在8个字节的空间放16个字节的内容,很明显程序会奔溃。那么,接下来改动程序就变得很简单,只需要给str1分配最够的空间即可 。

   3.strcpy

    字符串拷贝函数。函数原型:char *strcpy( char *strDestination, const char *strSource );

    实现:

    char  *strcpy(char *dest, const char *src)

    {

     assert(dest);

     assert(src);

     char *ret = dest;

     while (*src)

     {

     *dest = *src;

     src++;

     dest++;

     }

             *dest = '\0';

     return ret;

    }

    同样,这里要告诉大家我在写这个函数的时候遇到的问题。

     1).首先是const和assert的使用。

    2).在拷贝的代码中可以简化书写。

    while(*dest++ = *src++),同时不要忘记while循环中有语句。不建议写成while(*dest++ = *src++);(注意后面的“;”是while循环的语句)。应该写成

      while(*dest++ = *src++)

    {

        ;

     }

这样别人再看你的代码的时候也会一目了然,同时便与查错。

     4.strcmp

     字符串比较函数。函数原型:int strcmp( const char *string1, const char *string2 );

     实现:

    int my_strcmp(const char *dest, const char *src)

    {

     assert(dest);

     assert(src);

     while (*dest == *src)

     {

     if (*src == '\0')

     return 0;

     dest++;

     src++;

     }

     return *dest - *src;

    }

     同样,分析一下这个函数。

     1).再次强调 const和assert的使用。

    2).关注一下这个函数的返回值。


    以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。