有一个字符数组的内容为:“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’为止,跳出循环。