//
// 以单词为单位进行反序,按行进行,标点符合不反序. 例如:
// "ABC DEF GH.\nabc def gh."反序为"GH. DEF ABC\ngh. def abc"
//
// 方法:先将句子中字母倒置,然后将每个单词字母倒置,如下.
// .HG FED CBA\n.hg fed cba
// GH. DEF ABC\ngh. def abc
//
#include <cstdlib>
#include <cassert>
#include <iostream>
//
// 将单词字母倒置.
//
void reverse_word(char *word, size_t length)
{
assert(NULL != word);
char ch;
for (size_t i = 0; i < length / 2; ++i)
{
ch = word[i];
word[i] = word[length - 1 - i];
word[length - 1 - i] = ch;
}
}
//
// 将句子所有字母倒置.
//
void reverse_sentence(char *sentence, size_t length)
{
size_t begin = 0;
reverse_word(sentence, length);
for (size_t offset = 0; offset < length; ++offset)
{
if (' ' == sentence[offset]) {
reverse_word(sentence + begin, offset - begin);
begin = offset + 1;
}
}
reverse_word(sentence + begin, length - begin);
}
//
// 将段落中所有单词的字母倒置.
//
void reverse_section(char *section)
{
assert(NULL != section);
// 将各个句子单词倒置.
for (size_t begin = 0, offset = 0; '\0' != section[offset]; ++offset)
{
if ('\n' == section[offset] || '\0' == section[offset])
{
reverse_sentence(section + begin, offset - begin);
begin = offset + 1;
}
}
}
int main(void)
{
char section[] = "ABC DEF GH.\nabc def gh.";
reverse_section(section);
std::cout << section << std::endl;
return EXIT_SUCCESS;
}