博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

段落以单词为单位按行反序

Posted on 2011-06-24 15:18  单鱼游弋  阅读(436)  评论(0编辑  收藏  举报
//
// 以单词为单位进行反序,按行进行,标点符合不反序. 例如: 
// "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;
}