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

博客讲述了如何在不使用库函数且限制额外空间的情况下,将字符数组'(student a am i)'的内容转换为'i am a student'。提供了两种方法,一种是利用数组进行字符串和单词的逆置操作,另一种是通过指针实现相同目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:
有一个字符数组的内容为:“student a am i”,
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
思路: 可以使用数组或者指针的方法实现。
先将整个字符串逆置过来,然后再将单个单词逆置,即可得到最终结果。
数组的方法:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Reverse(char arr[], int left, int right) { //写一个函数实现逆置
 while (left <= right) {
  char tmp = arr[left];
  arr[left] = arr[right];
  arr[right] = tmp;
  ++left;
  --right;
 }
}
int main() {
 char arr[] = "student a am i";
 int size = strlen(arr);
 int left = 0;
 int right = size - 1;
 Reverse(arr, left, right);   //逆置整个字符串数组
 printf("逆置整个数组:%s\n", arr);
 int i = 0;
 while (i < size) {
  if (arr[i] != ' ') {
   left = i;
   while (arr[i] != ' '&&arr[i] != '\0') {
    ++i;    //通过对空格的判断得到单个单词
   }
   right = i - 1;
  }
  Reverse(arr, left, right);   // 逆置单个单词
  ++i; //即arr[i]为空格时,i+1进入下次循环
 }
 printf("最终结果:%s\n", arr);
 system("pause");
 return 0;
}

运行结果:
在这里插入图片描述
指针的方法:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Swap(char* left, char* right) {
 while (left <= right) {
  char tmp = *left;
  *left = *right;
  *right = tmp;
  ++left;
  --right;
 }
}
void Reserve(char arr[]) {
 int size = strlen(arr);
 Swap(arr, arr + size - 1);//逆置整个字符串
 while (*arr != '\0') {
  char* start = arr;
  char* end = start;
  while (*end != ' '&&*end != '\0') {
   ++end;
  }
  Swap(start, end - 1);//逆置单个单词,其中end-1指向单词最后一个字母的下标
  if (*end != '\0') {
   arr = end + 1;//给前一个单词下标+1就跳过了空格指到了下一个单词首位置
  }
  else
   arr = end;
 }
}
int main() {
 char arr[] = "student a am i";
 Reserve(arr);
 printf("最终结果:%s\n", arr);
 system("pause");
 return 0;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值