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

单词反转实现

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

如题,代码例如以下:

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 微信小程序列表页面_微信发现没有小程序

    微信小程序列表页面_微信发现没有小程序尽量不要用缓存去写效果展示:点击编辑,进入编辑页第一页编辑按钮:<viewclass=”bj-btn”bindtap=”redactGroup”data-id=”{{传递的id}}”>编辑</view>redactGroup方法:options.currentTarget.dataset.前面自定义的名字redactGroup(options){letid=options.currentTarget.dataset.id;…

    2022年8月19日
    5
  • delphi xe5 激活成功教程

    delphi xe5 激活成功教程通过测试可用,RADStudioXE5激活成功教程补丁及方法第一步,将下载下来的“delphicbuilder_xe5_win.iso”解压到任意盘,任意目录。http://altd.embarcadero.com/download/radstudio/xe5/delphicbuilder_xe5_win.iso第二步,将“免序列号安装授权文件”文件夹中的“RADS

    2022年7月18日
    24
  • Java中的锁

    Java中的锁在学习或者使用Java的过程中进程会遇到各种各样的锁的概念:公平锁、非公平锁、自旋锁、可重入锁、偏向锁、轻量级锁、重量级锁、读写锁、互斥锁等待。这里整理了Java中的各种锁,若有不足之处希望大家在下方留言探讨。WARNING:本文适合有一定JAVA基础的同学阅读。公平锁和非公平锁公平锁是指多个线程在等待同一个锁时,必须按照申请锁的先后顺序来一次获得锁。公平锁的好处是等待锁的线程…

    2022年7月18日
    13
  • 男生pun是什么意思_pun怎么读

    男生pun是什么意思_pun怎么读PUN介绍入门PhotonUnityNetworking(首字母缩写PUN)是一个Unity多人游戏插件包。它提供了身份验证选项、匹配,以及快速、可靠的通过我们的Photon后端实现的游戏内通

    2022年8月6日
    5
  • ARP–利用arpspoof和driftnet工具进行arp欺骗

    ARP–利用arpspoof和driftnet工具进行arp欺骗实验目的:1.了解ARP欺骗的原理。2.对ARP欺骗进行进一步的认识并提出防范措施。3.掌握熟悉arpspoof和driftnet的使用方法。任务与要求:1、利用arpspoof进行ARP断网攻击2.利用arpspoof工具和driftnet工具进行ARP欺骗原理:ARP(AddressResolutionProtocol)是地址解析协议,是一种将IP地址转化成物理地址的协议。从IP地址到物理地址的映射有两种方式:表格方式和非表格方式。ARP具体说来就…

    2022年9月1日
    1
  • SSH_三大框架简单介绍

    SSH_三大框架简单介绍

    2021年7月10日
    107

发表回复

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

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