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

单词反转实现

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

如题,代码例如以下:

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));
	}

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 教大家一个可以用迅雷全速下载百度网盘文件的方法「建议收藏」

    教大家一个可以用迅雷全速下载百度网盘文件的方法「建议收藏」本帖最后由古道吹西风于2017-8-2822:11编辑 百度的各种限制,相信大家都是苦难言,每年赚那么多的钱,还这样小气,开通会员也一样的下载慢,我只说“我去年买了个表”这个方法网上有教程,大家也可以去网上搜一下,先看一下我家的网速,小区宽带6M 再看看下载速度 是不是全速,方法如下1.下载tampermonkey,这个google浏览器插件,插件可以去百度搜索下载。如下图 2.上传完…

  • 简述modelandview_ModelAndView

    简述modelandview_ModelAndView当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherServlet。因此,经常需要在控制器中构造ModelAndView对象。ModelAndView类提供了几个重载的构造器和一些方便的方法,让你可以根据自己的喜好来构造ModelAndView对象。这些构造器和方法以类似的方式支持视图名称和视图对象。当

  • 如何查看centos版本信息_怎么查看ie浏览器的版本

    如何查看centos版本信息_怎么查看ie浏览器的版本详细讲解查看CentOS版本信息的命令。   (一)查看已经安装的CentOS版本信息   1.cat/etc/issue查看版本  cat 缩写concatenate cat命令可以用来显示、合并文件。  CentOSrelease6.6(Final)  CentOS发行版6.6    etc 初期etc的英文名…

  • Verilog实现移位寄存器「建议收藏」

    Verilog实现移位寄存器「建议收藏」移位寄存器

  • git初次登陆使用

    git初次登陆使用git初次登陆使用一.安装git二.在当前项目根目录点击鼠标右键,出来下图:点击进入git命令行界面。三.初始化项目四.添加所有文件到项目中五.尝试提交所有文件我由于是第一次连接

  • oracle存储过程语法

    oracle存储过程语法前两天无意见看见了一个非常适合学习Oracle附上链接:https://blog.csdn.net/yucaifu1989/article/details/15813793Oracle存储过程基本语法存储过程   1CREATEORREPLACEPROCEDURE存储过程名   2IS   3BEGIN   4NULL;   5END; 行1:   CREAT…

发表回复

您的电子邮箱地址不会被公开。

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