题目
有一个字符数组的内容为: student a am i ,请将数组的内容改为 i am a student
要求:
不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
算法分析
先将整个字符串整体逆置,再以每个单词为对象局部逆置(这时判断条件复杂一些);这里逆置时,需要一个逆置函数,需要两个参数,首指针和尾指针,由这两个指针锁定一个区域,将里面的字符从头至尾逆置
注意:
- 最后一次跳出while循环时,相当于*pcur==’\0’,所以最后这个单词没有逆置,需要再次调用逆置函数
参考代码
#include <stdio.h>
#include <assert.h>
int my_strlen(const char *str)
{
int count = 0;
assert(str);
while(*str++)
{
count++;
}
return count;
}
void reverse_str(char *left,char *right)
{
assert(left);
assert(right);
while(left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
void reverse(char *str)
{
assert(str);
char *left = str;
char *right = str + my_strlen(str) - 1;
reverse_str(left,right);
}
int main()
{
char arr[] = "student a am i";
printf("请逆转每个单词:%s\n\n",arr);
char *pcur = arr;
//逆序字符串
reverse(arr);
//逆序单词
while(*pcur)
{
char *start = pcur;
while(*pcur != ' '&&*pcur != '\0')
{
pcur++;
}
reverse_str(start,pcur-1);
if(*pcur == ' ')
pcur++;
}
printf("逆转后的结果:\n");
puts(arr);
return 0;
}
部分资料来源于网络,版权属其原著者所有,只供学习交流之用。如有侵犯您的权益,请联系【公众号:码农印象】删除,可在下方评论,亦可邮件至ysluckly.520@qq.com。互动交流时请遵守宽容、换位思考的原则。