题目:有一个字符数组的内容为:"student a am i", 请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
student a am i
i ma a tneduts
i am a student
思路:再定义一个数组,把原数组的字符串倒着拷入目标数组(相当于源字符串逆过来),然后操作目标数组:即以空格为切分点,翻转每一个单词这里的翻转可以设置begin,end两个指针,一个向后走,一个向前走,将其指向的字符分别进行交换,直到两个指针相遇
考察的关键点:
(1)翻转字符串
(2)单词的分割
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//整体思路:再定义一个数组,把原数组的字符串倒着拷入目标数组(相当于源字符串逆过来)
//然后操作目标数组:即以空格为切分点,翻转每一个单词
//先求字符数组的长度
int Lenth(char* str)
{
assert(str);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
//把原数组的字符拷贝进目标数组
void ReverseCopy(char src[], char dest[],int len)
{
for (int i = 0; i < len; i++)
{
dest[i] = src[len-1-i];
}
}
void Swap(char*begin, char*end)
{
while (begin < end)
{
char tmp;
tmp = *begin;
*begin = *end;
*end = tmp;
begin++;
end--;
}
}
//每个单词翻转
void WordsReverse(char* dest)
{
char*begin = dest;
char*end = dest;
while (*dest != '\0')
{
end = dest;//dest每走一步之前,都要把值赋给end指针,因为进行操作的是begin与end。dest走到‘ ’时,参与交换的是前面那个字符
dest++;
if (*dest == ' '||*dest=='\0')//这里一定要加条件*dest=='\0',不然最后一个单词没有办法翻转;因为*dest != ' ',不会进入if语句中执行交换
{
Swap(begin, end);
++dest;
begin = dest;
}
}
}
int main()
{
char src[] = "student a am i";
int len = Lenth(src);
char dest[1024] = { 0 };
ReverseCopy(src, dest, len);
WordsReverse(dest);
printf("%s", dest);
system("pause");
return 0;
}
运行结果:
此题还可以直接操作原字符数组,思路一样,都是先整体翻转字符串,再逐一翻转每个单词
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//先求字符数组的长度
int Lenth(char* str)
{
assert(str);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
void Swap(char*begin, char*end)
{
while (begin < end)
{
char tmp;
tmp = *begin;
*begin = *end;
*end = tmp;
begin++;
end--;
}
}
void ReverseStr(char*str)
{
int len = Lenth(str);
//第一步:将整个字符串翻转过来
Swap(str, str + len - 1);
//第二步:翻转每一个单词
char*begin = str;
char*end = str;
while (*str!= '\0')
{
end = str;//dest每走一步之前,都要把值赋给end指针,因为进行操作的是begin与end。dest走到‘ ’时,参与交换的是前面那个字符
str++;
if (*str == ' '||*str=='\0')//这里一定要加条件*dest=='\0',不然最后一个单词没有办法翻转;因为*dest != ' ',不会进入if语句中执行交换
{
Swap(begin, end);
++str;
begin = str;
}
}
}
int main()
{
char src[] = "student a am i";
int len = Lenth(src);
ReverseStr(src);
printf("%s", src);
system("pause");
return 0;
}