逆序字符串
例如有这样的字符串“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);
}
如果有错误的地方请多多指教。
个人博客:https://wshuaigit.github.io/