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