倒置字符串

有一个字符数组的内容为:“student a am i”, 请你将数组的内容改为"i am a student".
要求: 不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
例如 :i am a student 通过逆置到如下:
student a am i
i ma a tneduts
源代码如下:

#include <stdio.h>
#include <windows.h>
#pragma warning (disable :4996)
int MyStrlen(char *str)
{
 int count = 0;
 int i = 0;
 while (*str != '\0')
 {
  count++;
  str++;
 }
return count;
}
void reverse(char *left, char *right)
{
 while (left < right)
 {
 char tmp = 0;
 tmp = *left;
 *left = *right;
 *right = tmp;
 left++;
 right--;
 }
}
void ReverseStr(char str[])
{
 char *left = str;
 char *right = str + MyStrlen(str) - 1; //指的是尾部地址
 char *cur = str;
 while (*cur != '\0')
 {
  char *start = cur;
  while (*cur != ' ' &&  *cur != '\0')
  {
   cur++;
  }
  reverse(start, cur - 1);
  if (*cur == ' ')
  {
   cur++;
  }
 }
}
int main()
{
 char str[] = { "i am a student" };
 char *left = str;
 char *right = str + MyStrlen(str) - 1;
 printf("原字符串: %s\n", &str);
 reverse(left, right);
 printf("逆置字符串: %s\n", &str);
 ReverseStr(str);
 printf("逆置字符串中的单词: %s\n", &str);
 system("pause");
 return 0;
}

运行结果:
在这里插入图片描述
个人理解:
该算法的核心思想是新建一个字符型指针变量通过循环去遍历,如果遇到空格且不是‘\0’说明一个单词还没遍历完。
而倒置需要两个地址参数,所以在循环里面通过新建另一个字符型指针变量作为开始,
而cur会自加,所以一直到不满足循环条件的时候(即找到了‘ ’或着到了‘\0’),停止自加,然后逆置这个单词,
此时cur指向字符串的最后一个字符的地址。
再判断是不是最后一个字符,如果不是则再自加一次,说明空格遍历完到了下个单词了。
再下此进入循环时,cur指向的是下个单词的首地址,用start指向此时的这个首地址,
然后再用cur遍历到最后一个单词,直到最后遇到‘\0’为止,跳出循环。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值