问题描述:
有一个字符数组的内容为:“student a am i”,
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
student a am i
i ma a tneduts
i am a student
思路:
对字符串内容进行逆转,可以先逆转整个句子的顺序,再逆转每个单词的顺序。
用到的函数及作用:
void Reverse_one(char *left, char *right)
{
while (left < right){
char t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
这一部分函数,对指定长度的字符串进行逆转(长度为right-left),当left < right成立时,交换left和right指向的内容
void Reverse(char *p, int len)
{
char *left = p;
char *right = p + len - 1;
Reverse_one(left, right);
while(*p){
//找到每个单词
left = p;
while ((*p != ' ') && (*p != '\0')){
p++;
}
right = p - 1;
//对每个单词进行逆转
Reverse_one(left, right);
if (*p == ' '){
p++;
}
}
}
在这一部分函数中,首先,将整个字符串逆转,结果是:
然后,在对每一个单词进行逆转,结果是:
即可完成题目要求
用到的知识点:
1、数组传参会发生降维,降维成指向数组内容的指针;
2、对指针解引用表示的是指针所指向的目标;
3、指针加一,加的是其所指向类型的大小;
运行结果:
完整代码:
#include<stdio.h>
#include<windows.h>
void Reverse_one(char *left, char *right)
{
while (left < right){
char t = *left;
*left = *right;
*right = t;
left++;
right--;
}
}
void Reverse(char *p, int len)
{
char *left = p;
char *right = p + len - 1;
Reverse_one(left, right);
while(*p){
left = p;
while ((*p != ' ') && (*p != '\0')){
p++;
}
right = p - 1;
Reverse_one(left, right);
if (*p == ' '){
p++;
}
}
}
void main()
{
char str[] = "student a am i";
int len = sizeof(str) / sizeof(str[0])-1;
printf("原字符串为 > %s\n", str);
Reverse(str, len);
printf("逆置后的字符串为 > %s\n", str);
system("pause");
}