//
// 以单词为单位进行反序,按行进行,标点符合不反序. 例如: 
// "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;
}