字符串逆序算法实现

来源:互联网 发布:保代宝典在哪里买 知乎 编辑:程序博客网 时间:2024/05/24 04:26

给定一个字符串S,将字符串S中的字符顺序颠倒过来,即实现字符串的逆序。本文将介绍一种字符串逆序算法的实现。

     字符串逆序算法如下所示:

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">char *Reverse(char *s){char *p=s;char *q=s;while(*q){++q;}q--;while(p<q){char t=*p;*p++=*q;/*注意运算符优先级,*指针运算符与++自加运算符是处于同一级的运算符,优先级结合方式是从右自左*/*q--=t;}return s;}</span></span></span>
以上算法是利用两个指针分别指向字符串的头和尾,利用在字符串中指向前面元素的指针变量值小于指向其后面元素的指针变量值作为判断条件,交换两个指针变量所指向的元素。在以上代码中需要注意两点:1、在字符串中指向前面元素的指针变量值小于指向其后面元素的指针变量值。2、注意运算符优先级,*指针运算符与++自加运算符是处于同一优先级的运算符,优先级结合方式是从右自左。

下面是整个程序的代码:

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">#include <stdio.h>#include <stdlib.h>char *Reverse(char *s){char *p=s;char *q=s;while(*q){++q;}q--;while(p<q){char t=*p;*p++=*q;/*注意运算符优先级,*指针运算符与++自加运算符是处于同一级的运算符,优先级结合方式是从右自左*/*q--=t;}return s;} int main(int argc, char *argv[]) {char *a="hello";printf("原字符串:%s\n",a);printf("逆序之后的字符串:%s\n",Reverse(a));return 0;}</span></span></span>
在Dev-C++编译器中编译运行上面的程序,将会出错,出现以下情况:

 

这里之所以会出现这种情况是由于没有弄清数组名与指针的区别。

指针是可以指向任意数据类型的内存块,数组名可以在静态数据存储区被创建。从原理与定义上看,指针与数组名是两个不同的概念,但指针可以方便地访问数组或模拟数组,两者之间貌似存在一种等价的关系,但两者也有一些不同之处,主要体现在以下方面:

1、修改内容不同

使用数组名定义一个字符串可以方便地访问、修改数组中的元素,例如char a[]="hello"可以方便地通过获取下标修改数组中的元素,a[0]=''X是可以进行的正确操作。但使用指针定义一个字符串却不能修改字符串中的元素,例如char *s="Hello"中指针s指向的是一个字符串常量,不能进行进行s[0]='X'操作,否则会编译报错。

2、所占字节数不同

对char *s="Hello"中s为指针,执行sizeof(s)操作,其结果为一个指针变量所占用的字节数,而不是指针s所指向内存单元的大小。在C/C++语言中是没有办法知道指针所指向内存单元的大小,除非在申请内存时标记出来。

char *s="Hello"

char a[]="hello"

在32位机器中,sizeof(s)=4字节,sizeof(a)=6字节。

但需要注意的是,使用数组作为函数参数的话,数组名自动退化为同类型的指针。例如:

void Fun(char a[100])

{

printf("sizeof(a)=%d\n",sizeof(a));

}

此时sizeof(a)=4字节,而不是sizeof(a)=100*sizeof(char)=100.

所以经过以上分析,修改main函数中字符串a的定义,修改后的程序如下:

<span style="font-size:18px;">#include <stdio.h>#include <stdlib.h>char *Reverse(char *s){char *p=s;char *q=s;while(*q){++q;}q--;while(p<q){char t=*p;*p++=*q;/*注意运算符优先级,*指针运算符与++自加运算符是处于同一级的运算符,优先级结合方式是从右自左*/*q--=t;}return s;} int main(int argc, char *argv[]) {char a[]="hello";printf("原字符串:%s\n",a);printf("逆序之后的字符串:%s\n",Reverse(a));return 0;}</span>

源码下载(github)

0 0
原创粉丝点击