简述
给定一个字符串,逐个翻转字符串中的每个单词。
思路
1. 从后往前遍历,开始前先用两个变量i、j记住当前索引位置,每遍历一次i--,直到i<0退出循环;
2. 当遍历过程中索引i位置的数值为' ',则开始把' '的后的位置i+1到j的值都赋值到新数组,最后再在尾部加上' ',表示这一轮赋值完成;
3. 当要拷贝的字符串的首个字符不为' '时在while处理到最后一个' '时,并没有把最后一个单词给赋值进去就退出了循环,所以最后还是需要执行赋值操作的;
代码
char s[] = " tom is cat ";
void reverseWord(const char *s)
{
// 首先获取字符串的长度,并且开辟内存存放逆转后的字符
int len = strlen(s);
char *p = (char *)malloc(len + 1);
// i:当前遍历的索引, j:从索引处开始需要拷贝的位置
int i = len - 1, j = len - 1;
while (i >= 0)
{
// 从后往前遍历字符串,遇到' ',则开始把' '的后的位置i+1到j的值都赋值到新数组
if (s[i] == ' ')
{
for (int k = i + 1; k <= j; k++)
{
*p++ = s[k];
}
// 因为遇到的是' ',在拷贝完一个单词后,再把' '给加上
*p++ = ' ';
// 因为从后往前遍历,当前i的位置是' ',所以下一次要拷贝的位置不包括当前i,而是要往前一个字符
j = i - 1;
}
i--;
}
// 退出循环后还需要判断i+1与k的值,如果成立还是需要执行赋值操作的
// 因为当要拷贝的字符串的首个字符不为' ',时在while处理到最后一个' '时,
// 并没有把最后一个单词给赋值进去就退出了循环
for (int k = i + 1; k <= j; k++)
{
*p++ = s[k];
}
// len+1的目的就是为了在最后加上结束符 '\0'
*p = '\0';
// 由于p每次都是++,所以p当前指向的是字符串结尾,所以需要把指针指向头就得减去字符串长度
p = p - len;
qDebug() << p;
free(p);
}
输出
cat is tom