一、题目要求
有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
要求:
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
二、题目分析
初级理解:
乍一看,这是一个字符串逆置
可是真的有这么简单吗?
具体分析:
如上图所示
首先先将整体的字符串进行逆置
然后对各个单词逆置就可以得到我们想要的结果
所以要设置一个函数reverse_all,用来专门进行逆置,参数为逆置的首末地址
然后再用个函数reverse,进行调用reverse_all,来解这道题
三、代码实现
函数代码:
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* reverse_all(char* start , char* end)
{
assert(start != NULL);
assert(end != NULL);
char* p = start;
char tmp = 0;
while(start < end)
{
tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
return p;
}
char* reverse(char* str)
{
assert(str != NULL);
char* pstr = str;
char* start = str;
char* end = str;
while(*end != '\0')
{
while((*end != ' ')&&(*end != '\0'))
{
end++;
}
end--;
reverse_all(start,end);
start = end + 2;
end = start;
}
return pstr;
}
main函数代码块:
int main()
{
char str[128] = {"blog to my welcome"};
reverse_all(str,str-1+strlen(str));
printf("%s\n",reverse(str));
return 0;
}
运行结果: