翻转单词顺序
关于思路:
在翻转的时候,我们可以这么做,首先把整体进行翻转,例如,要反转I love you
第一步:整体翻转成ouy evol I;
第二步:分别翻转单词内部顺序: you love I
关于代码
#include<stdio.h>#include<stdlib.h>
void reserveS(char* start,char* end)
{
if (start == NULL || end == NULL)//注意这一步不能省
return;
while (start<end)
{
swap(*start,*end);
start++;
end--;
}
}
char * reserveD(char *s)
{
if (s == NULL)
return NULL;
char *end = s;
char *start = s;
while (*end != '\0')
{
end++;
} //从这出来的时候end已经到斜杠0了;
end--;//指最后一个字符
reserveS(start, end);//函数调完整句翻转了,现在开始翻转各个单词
end = start = s;
while (*start != '\0')
{
if (*start == ' ')
{
start++;
end++;
}
else if (*end == ' ' || *end == '\0')
{
reserveS(start, --end);
start = ++end ;
}
else
{
end++;
}
}
return s;
}
int main()
{
char s[] = "I feel happy now";
reserveD(s);
printf("%s",s);
system("pause");
return 0;
}
关于优化:
while (*end != '\0')
{
end++;
}
end--;
有一段代码这样写的,为了找到最后一个字符所在的位置,其实这样写会使时间复杂度变高,不太好看,如果用end = start+strlen(s);
这样是不是更好看呢,另外,在交换的时候,书上用了取中间值的办法进行交换,个人认为用swap函数,看起来能让代码短一点,更加好看一些。
关于总结:
在实现这个函数的时候,我在句子整体交换的时候出现了问题,在*start = *end的时候崩溃。一直调试没有找到错误,后来看主函数才发现自己给字符串的时候,给了一个指针去指向它,并未分配空间,所以后面再交换赋值的时候出现了问题,这个错误是特别不应该犯得。好了,改了这个错误,认为就没有错误了,然而继续崩溃,再次调试发现,有的地方应该用前置++前置--,而我都用了后置,改了之后,达到预期目标。