问题:
有一个字符数组的内容为:“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;
}
运行结果: