如何用多种方法实现字符串逆序

逆序字符串

      例如有这样的字符串“abcdefg”,我们将其逆序后变为“gfedcba”,现在我们来用多种方法实现字符串的逆序,并实现技术推演,避免使用指针的常用错误,提高代码的规范性。

        一:从第二项起,将后面的元素与它前面的元素逐个交换位置。示意图如下:

                    原始数据:a         b            c            d            e            f            g

                 第一次循环:b         a            c            d            e            f            g

                 第二次循环:c         b            a            d            e            f            g

                 第三次循环:d         c            b            a            e            f            g

                  第四次循环:e        d            c            b            a            f            g

                  第五次循环:f         e            d            c            b            a           g

                  第六次循环:g        f             e            d            c            b           a

        这种方法是不是需要两层循坏呢?而且还得进行大量的元素移动,非常浪费时间,可以说是非常差的算法了,这里不再对此做过多介绍。

        二:双指针法,使用两个指针分别指向字符串头和尾(注意:这里的尾并不是‘\0'),示意图如下:

       

        

代码如下:



        值得注意的是,如果代码是这样的,那么它还正确么?


        这样做是不看起来正确呢,但是这样做是错误的。如果你运行的话会直接崩的,为什么?可以分析一下这两段代码有什么区别?因为在上面那段代码中,“abcdefg”是存储在全局区的,只可以去读,不可以去改(这是大多数人在使用指针时老是错误的一个原因之一)。那么在使用的时候就得注意了,可以在临时区为它分配内存。如下:


        三、递归入栈

        我们知道,在栈区,变量是先进后出的,那么我们可以这样做来逆序字符串。


da

代码如下:

#include<stdio.h>

 int reverse(char *p)

{

       if(p==NULL)      //如果传入的是个空指针,不判断会怎么样?

              return -1;

       if(*p==’\0’)  //递归结束条件

              return ;

       reverse(p+1);

       printf(“%c”,*p);

}

int main()

{
       char *p=”abcdefg”;

       reverse(p);

}

        但是这样是不是一出栈之后变量就没了呢?如果我们想要存储的话怎么办?可以使用全局变量和局部变量进行存储。

        用全局变量进行存储:

        代码如下:

#include<stdio.h>

char tmp[1000]={0};

int reverse(char*p)

{

       if(p==NULL)

              return -1;

       if(*p==’\0’)

              return ;

       reverse(p+1);

       strncat(tmp,p,1);   //每次拷入一个字符

}

        用局部变量进行存储:

        代码如下:

int main()

{

              char *p=”abcdefg”;

              reverse(p);

printf(“%s”,tmp);

}

局部变量:

#include<stdio.h>

#include<string.h>

int reverse(char*p,char *buf)

{

       int i=0;

       if(p==NULL)

              return -1;

       if(*p=='\0')

              return ;

       reverse(p+1,buf);

       strncat(buf,p,1);

}

int main()

{

              char *p="abcdefg";

              char buf[1024]={0};

              reverse(p,buf);

              printf("%s",buf);

}


 如果有错误的地方请多多指教。





猜你喜欢

转载自blog.csdn.net/wang_zhao_/article/details/80490440