字符串反转问题

题目:给定字符串“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循环的控制语句(代码中有注释),所要反转字符串的大小的求法等等,希望多加注意~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值