字符串反转问题
2016-04-08 22:31
323 查看
题目:给定字符串“student a am i”,要求输出“i am a student”.(要求空间复杂度为1,不使用库函数)
题目分析:student a am i
i ma a tneduts(字符串整体反转)
i am a student(字符串中每个单词反转)
整体反转的时候,一定不要反转\0,如一旦反转,\0出现在首位,后边字符将不会输出。
代码展示:
我之所以写出我的想法和做法,是想用csdn记录我曾经犯下的错误,当日后再看到这篇文章时,就会想起曾经的错误,以至于不会再犯。
展示的代码,是老师讲解之后我整理的,程序容易写错的地方,比如while循环的控制语句(代码中有注释),所要反转字符串的大小的求法等等,希望多加注意~~
题目分析:student a am i
i ma a tneduts(字符串整体反转)
i am a student(字符串中每个单词反转)
整体反转的时候,一定不要反转\0,如一旦反转,\0出现在首位,后边字符将不会输出。
代码展示:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> void reverse(char *left, char *right) { char tmp; while (left < right) { tmp = *left; *left = *right; *right = tmp; left++; right--; } } void reverse_str(char arr[], int sz) { char *left = arr; char *right = arr + sz - 1; char *start = arr; char *end = arr;//为了保留起始和结束位置 reverse(left,right); while (*end != '\0') { while (*end != ' '&&*end != '\0') { end++; }//走出这个while循环时,一定是遇到了空格(即就是一个单词结束)或者是\0(整个字符串结束) reverse(start,end-1);//由于end此时要么是空格,要么是\0,所以减1 if (*end != '\0')//当end指向\0时,程序不需要向后执行 { start = end + 1;//start开始指向end指向元素的下一个位置 end = start;//end也从该位置开始,向后遍历 } } } int main() { char arr[] = "student a am i"; int len = sizeof(arr) / sizeof(arr[0]) - 1;//计算字符数组的长度,不包括\0 reverse_str(arr,len);//调用逆序函数 printf("%s",arr); system("pause"); return 0; }心得体会:其实,我并没有想到这个方法, 我的做法:再创建一个同样大的数组,从源字符串结尾想前,一个一个复制,当遇到空格或\0时,将整个字符串拷贝,再拷贝空格,当然,最后一个单词后拷贝的是\0.我这样做,首先没有做到空间复杂度为1;并且这样实现起来不容易。
我之所以写出我的想法和做法,是想用csdn记录我曾经犯下的错误,当日后再看到这篇文章时,就会想起曾经的错误,以至于不会再犯。
展示的代码,是老师讲解之后我整理的,程序容易写错的地方,比如while循环的控制语句(代码中有注释),所要反转字符串的大小的求法等等,希望多加注意~~
相关文章推荐
- 结对编程项目前篇
- CUDA笔记四性能
- Shell中的循环语句for、while、until实例讲解
- 实战Mahout聚类算法Canopy+K-means
- 两个蓝牙模块配对的方法
- 分步式系统中全局唯一主键
- 矢量切片——集美貌与才华于一身的底图方案
- ipad下添加126邮箱账户
- CUDA笔记二线程模型
- checkboxlist标签的用法
- SpringMVC 国际化
- 关系型数据库和非关系型数据库区别
- Linux报bus error(总线错误)解决办法
- Hdu5093 Battle ships 二分图
- 当教育遇到虚拟现实,Nearpod这家公司是怎么去做的?
- 基本语句及栗子
- CUDA笔记一编程模型
- Android Studio如何发布APK
- photoshop
- BZOJ2818: Gcd 欧拉函数求前缀和