您的位置:首页 > 其它

字符串反转问题

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出现在首位,后边字符将不会输出。

代码展示:
#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循环的控制语句(代码中有注释),所要反转字符串的大小的求法等等,希望多加注意~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: