百度网盘做视频网站,创意设计作品赏析,网络建设与管理是什么,阿里云主机建网站前言
不知道大家在做题时有没有遇到过“字符串旋转”的题目#xff0c;很多人可能没有思路#xff0c;这里我不具体讲解单一的题目#xff0c;而是展现一个“弹幕滚动”的示例#xff0c;相信大家看懂后就能做出“字符串旋转”的题了#xff01; 技术名词解释
1.什么是“… 前言
不知道大家在做题时有没有遇到过“字符串旋转”的题目很多人可能没有思路这里我不具体讲解单一的题目而是展现一个“弹幕滚动”的示例相信大家看懂后就能做出“字符串旋转”的题了 技术名词解释
1.什么是“字符串旋转”
举个例子给定字符串“abcdef”左旋一个单位就是“bcdefa”两个就是“cdefab”右旋同理。
2.何为弹幕滚动
弹幕滚动就是基于字符串旋转的原理只不过是持续进行旋转罢了比如“abcdef”紧接着的是“bcdefa”……每次显示都会覆盖上次显示的内容用到回车符接下来我们主要介绍从右向左滚动的实现
整体架构思路
1.正常遍历字符串
给定一个字符串我们来看一下正常遍历的代码是怎样的
int main()
{char str[] da jia hao ,wo shi xxx;int len strlen(str);int i;for (i 0; i len; i){putchar(str[i]);}return 0;
} 大家应该都对这段代码没什么问题那就应该知道这段代码是从字符串的第一个元素开始打印的要想滚动显示下一次就应该从第二个元素开始打印吧并且首元素还要放在最后一位第三次是第三个元素打头末尾放第二元素……要想实现这种流程我们不妨再借助一位变量的帮助这就有了我们的第二个思路
2.另创变量cnt打头元素靠他变末尾元素照不误
int i;
int cnt 0;
char str[] da jia hao, wo shi xxx;
int len strlen(str);for (i 0; i len; i){if (cnt i len)putchar(str[cnt i]);elseputchar(str[cnt i - len]);} 分析一下代码在遍历过程中如果cnti没有超出最大下标len-1那么所要显示的元素下标便是cnti,但如果大于等于lencnti就不可能作为数组下标了吧因为会越界但是没关系我们最后要显示的是本次所显示的开头元素之前的元素所以最后要显示的元素下标是cnti-len当然现在我们的cnt是0所以跟之前的只有i的情况没啥区别但只要当cnt1时是不是就是从第二个元素开始遍历了呢cnt2时是从第三个开始以此类推…… 列举一下看看假设字符串长度为5abcde当cnt1时i从0到4递增当i0,1,23时只靠if语句就可以显示bcde了当i4时cnti等于5该走else语句了显示的是cnti-len也就是0下标因此最后一个元素就是首元素这不就达成了预期吗
OK思路到这里没问题吧接下来就要考虑如何让cnt变化了也就是有了思路三。 3.cnt背后当大佬让谁出场谁出场
cnt该怎么变化呢我们知道弹幕滚动的关键变化就在开头和结尾第一次以字符串的首元素为开头第二次以次元素开头……不知道大家有没有发现每当显示开头字符的时候i的值必然为0而要显示的首字符又是依次递增的那是不是只要让cnt依次递增首字符也就依次往后排了呢OK就是这个思路往下走cnt初始值是0依次递增下去直到cntlen-1时也就是最后一个元素下标时str【cnti】(i0)就是字符串的最后一个字符如果想再来一遍滚动就让cnt重新归0并重复上述过程即可。代码如下
int main()
{int i;int cnt 0;char str[] da jia hao, wo shi xxx;int len strlen(str);while (1){putchar(\r);for (i 0; i len; i){if (cnt i len)putchar(str[cnt i]);elseputchar(str[cnt i - len]);}Sleep(500);if (cnt len - 1)cnt;elsecnt 0;}return 0;
} 技术细节
1.代码补充 最后代码示意图中采用了无限循环“字幕滚动”的形式为了避免“字符满天飞”的现象用了‘\r’每次显示弹幕但会覆盖掉上次的弹幕因此最终屏幕上也只有一行字符同时为了体现出“滚动”的效果中间用了Sleep函数延缓程序短暂时间也就是每次显示完一行弹幕后都会延缓0.5秒才显示下一次的弹幕
2.关于弹幕从左向右滚动
无需改变过多代码只需将下面的if else语句稍加修改即可
int main()
{int i;int cnt 0;char str[] da jia hao, wo shi xxx;int len strlen(str);while (1){putchar(\r);for (i 0; i len; i){if (cnt i len)putchar(str[cnt i]);elseputchar(str[cnt i - len]);}Sleep(500);if (cnt 0)cntlen-1;elsecnt --;}return 0;
}
小结
学好字幕滚动字符串旋转都是小菜