关于字符串的函数

来源:互联网 发布:协方差矩阵的计算 编辑:程序博客网 时间:2024/05/20 15:38

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

  目前,我在学习中碰到的字符串操作函数有: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).关注一下这个函数的返回值。


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



本文出自 “做一个小小小司机” 博客,请务必保留此出处http://10799170.blog.51cto.com/10789170/1715083

0 0