先介绍我自己的思路:
遍历这个字符串,然后用一个char*
类型的数组记录下每一个空格的位置,然后打印的时候,打印两个指针之间的字符。
for (; *c != '\0'; c++)
{
if (*c == ' ')
space[++i] = c;
}
这是遍历句子然后记录空格位置的程序。
只是我写程序的时候,处理空格不够完美,多打了空格并且代码也不是特别好
for (; i > 1; i--) print_char(space[i-1]+1, space[i]); print_char(space[0 ] , space[1]);
这一段我们本来是合在一起打印的,结果会出现空格的问题,然后我就这样拆开了。
下面是我的code:
#include <iostream>
void print_char( char*beg, char*end)
{
for (char* s = beg; s != end; s++)
std::cout << *s;
std::cout << " ";
}
void reverse_sentence(char* str)
{
char* c = str;
int i = 0;
char* space[50] = { NULL };
space[0] = c;//space[0]=beg
for (; *c != '\0'; c++)
{
if (*c == ' ')
space[++i] = c;
}
space[++i] = c;//end
for (; i > 1; i--)
print_char(space[i-1]+1, space[i]);
print_char(space[0 ] , space[1]);
}
int main()
{
char* str = "I am a student..";
reverse_sentence(str);
}
运行结果:
可以看出,最后一个字母的后面还是多打了一个空格,不过可以不用上面的print函数,单独给第一个单词写一句,不要打印空格的句子,我就不尝试了。
思路2:
还可以先把整个字符串翻转,得到
..tneduts a ma I
然后呢,再翻转每个单词。
这样的话,先遍历一遍进行翻转
这里大家准备怎么样翻转一个字符串呢?
介绍一个我觉得实现起来很简单的方法:
头尾各一个指针,然后向中间遍历,swap!
我直接写过这个问题:
翻转字符串
整个句子的翻转完成之后呢,我们再检测空格,然后对每个单词调用这个翻转的程序,也是很巧妙呢
代码我就懒得写了,还是喜欢自己写的哈哈。