单词反转实现「建议收藏」

单词反转实现

大家好,又见面了,我是全栈君。

如题,代码例如以下:

void reverse_words(std::string& original) 
{
	enum {
		scan_normal,
		scan_frag,
	} state;

	char buf[4];
	memset(buf, 0, sizeof(buf));

	int last = original.size() - 1;
	int cur = original.size() - 1;

	int n = original.size();
	char* p = &original.front(); // scan ptr
	char* movep = p; // move ptr
	state = scan_normal;

	int wfrag_len = 0;
	int wlen = 0;
	int movel = n;

	int scan_ok;
	while (n > 0) {
		scan_ok = 1;
		int end_frag = 0;
		wfrag_len = 0;
		// scan word until ' ' or word size >= word_buf
		while (p[cur] != ' ') {
			--cur;
			if ( (wfrag_len = (last - cur)) >= sizeof(buf) ) {
				scan_ok = 0;
				if (scan_normal == state) {
					state = scan_frag;
				}
				break;
			}
		}

		if (state == scan_normal)
			wlen = wfrag_len;
		else
			wlen += wfrag_len;
			
		movel = n - wfrag_len;
		if (movel <= 0 || n <= wlen)
			break;

		if (scan_ok) {
			if (state == scan_frag) {
				state = scan_normal;
				end_frag = 1;
			}
		}

		if (wfrag_len > 0) {
			memcpy(buf, p + cur + 1, wfrag_len);
			memmove(p + wfrag_len + scan_ok - end_frag, p, movel - (scan_ok - end_frag));
			if (end_frag)
				memmove(p + wlen, p + wlen - 1, n - wlen);
			memcpy(p, buf, wfrag_len);
		}
		else { // skip empty
			memmove(p + wlen + 1, p + wlen, movel - wlen - 1);
		}

		if (scan_normal == state) {
			p[wlen] = ' ';
			p += (wlen + 1);
			n -= (wlen + 1);
			cur = last = (n - 1);
		}
		else { // scan_frag
			cur = last;
		}

		if (scan_ok || end_frag)
			wlen = 0;

		memset(buf, 0x0, sizeof(buf));
	}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116297.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android加密参数定位方法

    android加密参数定位方法作者正在编写一本爬虫逆向相关的书籍《书名还没有想好》。目前刚写了50页,上图是文章目录的一部分,想问一下大家现在对哪阶段的内容会更感兴趣,或者哪部分的内容会更有学习力,或者帮我想个书名。可在本文末留言告知,感谢大家。下面开始本文正文内容。在逆向一个Android程序时,如果只是盲目的分析需要阅读N多代码才能找到程序的关键点或Hook点,本文将分享一下如何快速的找到APP程序的加密参数位置,其实不论是找关键位置、找hook点,找加密参数、代码逻辑追踪,都是类似的处理方法。巧用搜索-静态分析

    2022年5月17日
  • 领域驱动实践总结(基本理论总结与分析V+架构分析与代码设计+具体应用设计分析)

    领域驱动实践总结(基本理论总结与分析V+架构分析与代码设计+具体应用设计分析)领域驱动实践总结一:基本理论总结与分析一、领域驱动设计两大设计:战略设计和战术设计二、理解和分析领域+子域+核心域+通用域+支撑域三、理解和分析界限上下文,定义领域边界四、理解和分析实体和值对象五、理解和分析聚合思想:聚合和聚合根六、理解很分析领域事件来解耦微服务…

    2022年4月26日
  • jsonArray转list<map>

    jsonArray转list<map>直接转是转不了的需要先得到jsonArray循环得到jsonObject然后保存到map再添加到listList&lt;Map&lt;String,String&gt;&gt;list=newArrayList&lt;Map&lt;String,String&gt;&gt;();…

    2022年6月23日
  • ldapsearch命令详解_ldapsearch命令详解

    ldapsearch命令详解_ldapsearch命令详解参数用途-?打印关于使用ldapsearch的帮助。-aderef指定别名反向引用。请输入never、always、search或find。如果不使用此参数,缺省为never。-A只检索属性的名称,而不检索属性的值。-bbasedn指定用作搜索起始点的专有名称。使用引号来指定该值,例如:”ou=West,o=Acme,c=US”如果要搜索的服务器需要指定搜索…

    2022年10月31日
  • 振动与频谱分析_10频震动什么意思

    振动与频谱分析_10频震动什么意思

    2022年10月15日
  • 蓝鲸自动化运维平台

    蓝鲸自动化运维平台蓝鲸自动化运维平台1.蓝鲸简介官网:https://bk.tencent.com/docs/腾讯蓝鲸智云,简称蓝鲸,是腾讯互动娱乐事业群(InteractiveEntertainmentGroup,简称IEG)自研自用的一套用于构建企业研发运营一体化体系的PaaS开发框架,提供了aPaaS(DevOps流水线、运行环境托管、前后台框架)和iPaaS(持续集成、CMDB、作业平台、容器管理、数据平台、AI等原子平台)等模块,帮助企业技术人员快速构建基础运营PaaS。2.蓝鲸部署2

    2022年5月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号