二、按单词逆序
给定一个字符串,按单词将字符串逆序。例如,给定 ” I am a student “,则输出是 “student a am I “,为了简化问题,字符串中不包含标点符号。一共分两个步骤,第一步先按单词逆序得 ” I ma a tneduts”,第二步整个句子逆序得到 “student a am I “。
#include <iostream>
using namespace std;
void ReverseWord(char *p, char *q)
{
while (p < q) // 注意点1
{
char temp = *q;
*q-- = *p;
*p++ = temp;
}
}
char *Reverse(char *s)
{
char *p = s;
char *q = s;
while (*q != '\0')
{
if (*q == ' ')
{
ReverseWord(p, q - 1); // 遇到空格,就反转空格之前的部分(即从p到q-1部分的字符)。
q++; // 跳过当前空格; 注意点2
p = q; // 将当前空格后的那个字符,作为p的新位置。
}
else
q++;
}
ReverseWord(p, q - 1); // 反转字符串'\0'之前的那部分子串。
ReverseWord(s, q - 1); // 所有的单词都逆序后,将整个句子看成一个整体,即一个包含空格的单词,再逆序一次即可。
return s;
}
int main(int argc, const char * argv[]) {
char str[] = "I am a student";
char *s = Reverse(str);
printf("%s\n", s);
return 0;
}
三、字符串的逆序打印
即只要求逆序输出,不要求逆序存储。
(1)可以先反转字符串,再顺序输出。
(2)先求字符串长度,然后反向遍历即可。(使用下标)
(3)先遍历到末尾,然后再遍历回来,需要借助字符串的 ‘\0’。(使用指针)
(4)递归。
下面仅对递归方法做简要描述:
void ReversePrint(char *s)
{
if (*(s+1) != '\0')
ReversePrint(s+1); // 此处不能使用s++,因为会改变s,应使用s+1;
printf("%c", *s);
}
补充一个小知识点:
char str[] = “Student”;
char *str = “Student”;
不论是字符数组,还是字符串常量,(*str)都代表当前字符串的首个字符,即 S。