strrev函数
2016-08-20 10:52
134 查看
原型: char *strrev(char *s);
用法:#include <string.h>
功能:把字符串s的所有字符的顺序颠倒过来(不包括空字符NULL)。
说明:返回指向颠倒顺序后的字符串指针。
注意:这个函数直接使用时不能颠倒例如以下的内容:
很显然这里的"string"作为常量放在常量区是不可修改的,而strrev函数的本质就是对forward指针指向的地址就行操作,所以编译器会报错。解决方法是用下面的方法进行初始化:
这样做将字符串以数组的方式存入栈,这时就可以利用该函数了。但是如何自己写这个函数呢?简单的思路就是创建一个函数,并传入字符串的首地址,在函数内申请两个指针,一个指向之字符串首地址,一个指向尾地址(为什么一定要这样做呢?因为希望直接利用字符串结尾的’\0‘,这样就不用去考虑新建字符串后面如何+’\0‘的问题了),然后利用首尾斤进行数据交换,但是在尝试直接交换后我得到了“string”的逆序,不是“gnirts”,而是“strrts”,道理很简单,首先,首部的数据移到尾部时覆盖了尾部的数据,第二,一开始是首部数据搬到尾部,但是到了后期就变成了逆序后的字符串尾部数据搬到首部,自然会出现上面的状况。解决方法,第一,创建中间变量,在首部数据覆盖尾部数据之前备份尾部数据;第二,在移动数据之前判断是否到了中间位置。
贴上按照这个思路编写的代码:
在编写是没有注意应该有p2=p;导致在一开始运行的时候编译器死机,原因在于未声明char *p;作为定义并未声明,这时候在解引用的时候相当于使用了野指针,自然会报错,正确的使用方法是在初始化同时声明,或者像上面的代码里,初始化为NULL,虽然初始化为NULL,在后面粗心直接解引用后果是出现段错误(segmentation fault),但是这是个绝对不可用的地址,不会造成太大的损失。
以上代码虽然可以实现srerev函数的功能,但是效率却大打折扣,因此改善如下。
用法:#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‘。
相关文章推荐
- 使用三个函数(_strdup _strrev _stricmp)判断一个字符串是否对称
- 实现strrev()函数
- 一天一个CRT函数 strrev
- strrev()字符串反转函数
- strrev 字符串反转函数
- 编写字符串反转函数strrev
- 写一个函数替代strrev()--实现字符串翻转
- C++编写字符串反转函数mystrrev(来源:西安交通大学-计算机程序设计-中国大学MOOC)
- 面试题目写一个字符串逆序函数strrev()
- 处理使用strrev()函数时的乱码问题
- 用C语言实现字符串反转函数strrev的经典方法
- for循环的使用 反转字符串,手写strrev()函数 解决问题
- php 字符串strrev 函数
- [备忘] 字符串倒序函数strrev
- 几个简单但是不太常用的函数:cprintf, clrscr, strrev, cin.getline, strchr, strstr
- C语言翻转字符串函数strrev ( ) 的库函数源代码
- PHP反转字符串函数strrev()函数的用法
- strrev函数
- strcpy strlen memcpy strcat strcmp strstr strrev函数的实现代码
- 编写字符串反转函数mystrrev(题目来源:中国大学mooc网---西安交大-计算机程序设计)