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

//
// 以单词为单位进行反序,按行进行,标点符合不反序. 例如:
// "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;
}
posted @   Atypiape  阅读(442)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示