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

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

不管是对整个字符串进行转换,还是对每一个单词进行转换,都需要用到转换函数,所以要写一个转换函数(具体实现在reverse函数里),首先实现整个字符串的逆置,只需把字符串的首尾地址传过去,就能对整个字符串进行逆置,而其后对每个单词进行逆置,最主要的是要找到每个单词的首尾地址,通过while循环来找到其地址(具体实现在String_reveverse函数中),最后利用reverse函数进行转换。

student a am i
先整个字符串转换后得到:i ma a tneduts
然后进行单词转换后得到:i am a student

#include<stdio.h>
#include<Windows.h>
void reverse(char *start,char *end)
{
	char tmp = 0;
	while (start < end)
	{
		tmp = *start;
		*start = *end;
		*end = tmp;
		start++;
		end--;
	}
}
void String_reveverse(char *arr,int len)
{
	char *left = arr;
	char *right = arr + len - 1;
	char *cur = arr;
	reverse(left, right);
	while (*cur != '\0')
	{
		left = cur;
		while (*cur != ' '&& *cur != '\0')
		{
			cur++;
		}
		reverse(left, cur - 1);
		if (*cur == ' ')
		{
			cur++;
		}
	}
}
int main()
{
	int i = 0;
	char arr[] = "student a am i";
	int len = sizeof(arr) / sizeof(arr[0])-1;//需要减去\0字符
	String_reveverse(arr,len);
	for (i = 0; i < len; i++)
	{
		printf("%c", arr[i]);
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44930562/article/details/90741744