您的位置:首页 > 其它

strrev函数

2016-08-20 10:52 134 查看
原型: char *strrev(char *s);
用法:#include <string.h>
功能:把字符串s的所有字符的顺序颠倒过来(不包括空字符NULL)。
说明:返回指向颠倒顺序后的字符串指针。
注意:这个函数直接使用时不能颠倒例如以下的内容:
char *forward="string";

很显然这里的"string"作为常量放在常量区是不可修改的,而strrev函数的本质就是对forward指针指向的地址就行操作,所以编译器会报错。解决方法是用下面的方法进行初始化:
char forward[]="string";

这样做将字符串以数组的方式存入栈,这时就可以利用该函数了。但是如何自己写这个函数呢?简单的思路就是创建一个函数,并传入字符串的首地址,在函数内申请两个指针,一个指向之字符串首地址,一个指向尾地址(为什么一定要这样做呢?因为希望直接利用字符串结尾的’\0‘,这样就不用去考虑新建字符串后面如何+’\0‘的问题了),然后利用首尾斤进行数据交换,但是在尝试直接交换后我得到了“string”的逆序,不是“gnirts”,而是“strrts”,道理很简单,首先,首部的数据移到尾部时覆盖了尾部的数据,第二,一开始是首部数据搬到尾部,但是到了后期就变成了逆序后的字符串尾部数据搬到首部,自然会出现上面的状况。解决方法,第一,创建中间变量,在首部数据覆盖尾部数据之前备份尾部数据;第二,在移动数据之前判断是否到了中间位置。
贴上按照这个思路编写的代码:
char * mystrrev(char *p)
{
char *p1;
char *p2;
char ch;
static int i=0,j=0;
p1=p;
p2=p;
while(*(p1+i))
{
i++;
}
for(j=0;j<i;j++)
{
if((p1+i-1-j)>(p2+j))
{
ch=*(p2+j);
*(p2+j)=*(p1+i-1-j);
*(p1+i-1-j)=ch;
}
}
return p2;
}


在编写是没有注意应该有p2=p;导致在一开始运行的时候编译器死机,原因在于未声明char *p;作为定义并未声明,这时候在解引用的时候相当于使用了野指针,自然会报错,正确的使用方法是在初始化同时声明,或者像上面的代码里,初始化为NULL,虽然初始化为NULL,在后面粗心直接解引用后果是出现段错误(segmentation fault),但是这是个绝对不可用的地址,不会造成太大的损失。
以上代码虽然可以实现srerev函数的功能,但是效率却大打折扣,因此改善如下。
char * mystrrev(char* p)
{
char *p1=p;
char *p2=p;
char ch;
while(*p1++);
p1--;
p1--;

while(p2 < p1)
{
ch = *p2;
*p2++ = *p1;
*p1-- = ch;
}

return(p);
}
这里的第一个p1--的目的是消除上面最近一个p1++的效果(++在后,后使用),第二个是跳过'\0‘。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  strrev C函数库