C语言实现英语句子按单词倒叙
题目:有一个字符数组的内容为:”student a am i”,请你将数组的内容改为”i am a student”.
要求: 不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
分析及解题思路
可以看出这句话(字符串)是以单词为单位倒叙,即单词本身内部并不倒叙。所以不可以将整个字符串倒叙。
思路:先将整个字符串倒叙(此时单词内部也倒叙了),再做每个单词内部的调整。
编程步骤
1.主函数
- 声明字符数存储字符串
- 用函数实现功能——函数后文详解
int main()
{
char arr[] = "student a am i";
int len = strlen(arr);
Swap(arr, ( arr+len-1)); //倒换字符串
SwapWord(arr, len); //倒换单词--内部套用swap()函数
printf("%s\n",arr);
return 0;
}
- Swap 函数的参数是两个指针,第一个指针指向首字符,第二个指针指向尾字符
- 注意 数组最后一个元素下标为长度减一即(len-1)
2.构造倒换字符串的函数 Swap(char *p1,char *p2);
- 参数为字符指针传入首位元素地址
void Swap(char *p1,char *p2)
{
while(p1<=p2)
{
char inter;
inter = *p1;
*p1 = *p2;
*p2 = inter;
p1++;
p2--;
}
}
3.构造倒换单词函数 void SwapWord(char arr[ ],int len);
- 需要的参数为:已经整体倒叙后的字符数组,和数组的长度(用来控制循环)
- 创建一个动态变量status用来表示循环到单词内部还是在空格部分,0表示在单词外,即遇到不是空格且status==0则将指针p1指向单词的第一个字母,并将status改为1,在当遇到空格且status==1时则将指针p2指向单词最后一个字母arr[i-1]同时将status改为0.
- 可利用Swap函数进行调换提高代码利用率,只需将单词第一个字母地址和单词结尾字母地址传入
void SwapWord(char arr[],int len)
{
int i = 0, status = 0;
char *p1 = NULL, *p2 = NULL;
for(i = 0; i<len; i++)
{
if(arr[i]!= ' '&& status == 0 )
{
p1 = &arr[i];
status = 1;
}
if(arr[i]== ' '&& status ==1)
{
p2 = &(arr[i-1]);
status = 0;
Swap(p1,p2);
}
}
p1= p1;
p2 = &arr[len-1];
Swap(p1,p2);
}
- 因为最后一个单词后没有空格,所以循环时无法处理到最后一个单词,需在循环后再做处理,循环后p1已经指向最后一个单词的首字母,只需将p2指向最后单词尾字母后再次调用Swap函数即可
结果展示
代码整体
结果展示