有一个字符数组的内容为:"student a am i", 请你将数组的内容改为"i am a student".

题目:有一个字符数组的内容为:"student a am i", 请你将数组的内容改为"i am a student". 
要求: 
不能使用库函数。 
只能开辟有限个空间(空间个数和字符串的长度无关)。 

student a am i 
i ma a tneduts 
i am a student

 


思路:再定义一个数组,把原数组的字符串倒着拷入目标数组(相当于源字符串逆过来),然后操作目标数组:即以空格为切分点,翻转每一个单词这里的翻转可以设置begin,end两个指针,一个向后走,一个向前走,将其指向的字符分别进行交换,直到两个指针相遇

考察的关键点:

(1)翻转字符串

(2)单词的分割

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//整体思路:再定义一个数组,把原数组的字符串倒着拷入目标数组(相当于源字符串逆过来)
//然后操作目标数组:即以空格为切分点,翻转每一个单词

//先求字符数组的长度
int Lenth(char* str)
{
	assert(str);
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
//把原数组的字符拷贝进目标数组
void ReverseCopy(char src[], char dest[],int len)
{
	for (int i = 0; i < len; i++)
	{
		dest[i] = src[len-1-i];
	}
}

void Swap(char*begin, char*end)
{
	while (begin < end)
	{
		char tmp;
		tmp = *begin;
		*begin = *end;
		*end = tmp;
		begin++;
		end--;
	}
}
//每个单词翻转
void WordsReverse(char* dest)
{
	char*begin = dest;
	char*end = dest;
	while (*dest != '\0')
	{
		end = dest;//dest每走一步之前,都要把值赋给end指针,因为进行操作的是begin与end。dest走到‘ ’时,参与交换的是前面那个字符
		dest++;
		if (*dest == ' '||*dest=='\0')//这里一定要加条件*dest=='\0',不然最后一个单词没有办法翻转;因为*dest != ' ',不会进入if语句中执行交换
		{
			Swap(begin, end);
			++dest;
			begin = dest;
		}
	}
}


int main()
{
	char src[] = "student a am i";
	int len = Lenth(src);
	char dest[1024] = { 0 };
	ReverseCopy(src, dest, len);
	WordsReverse(dest);
	printf("%s", dest);
	system("pause");
	return 0;
}

运行结果:

此题还可以直接操作原字符数组,思路一样,都是先整体翻转字符串,再逐一翻转每个单词

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//先求字符数组的长度
int Lenth(char* str)
{
	assert(str);
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

void Swap(char*begin, char*end)
{
	while (begin < end)
	{
		char tmp;
		tmp = *begin;
		*begin = *end;
		*end = tmp;
		begin++;
		end--;
	}
}

void ReverseStr(char*str)
{
	int len = Lenth(str);
	//第一步:将整个字符串翻转过来
	Swap(str, str + len - 1);
	//第二步:翻转每一个单词
		char*begin = str;
		char*end = str;
		while (*str!= '\0')
		{
			end = str;//dest每走一步之前,都要把值赋给end指针,因为进行操作的是begin与end。dest走到‘ ’时,参与交换的是前面那个字符
			str++;
			if (*str == ' '||*str=='\0')//这里一定要加条件*dest=='\0',不然最后一个单词没有办法翻转;因为*dest != ' ',不会进入if语句中执行交换
			{
				Swap(begin, end);
				++str;
				begin = str;
			}
		}

}

int main()
{
	char src[] = "student a am i";
	int len = Lenth(src);
	ReverseStr(src);
	printf("%s", src);
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值