C# 输出一个字符串的前缀、后缀和它的子串(信息内容安全 实验一)
一、什么是前后缀
字符串的前缀:符号串左部的任意子串(或者说是字符串的任意首部)
字符串的后缀:符号串右部的任意子串(或者说是字符串的任意尾部)
举例:比如 101110 它的前缀就是空串、1、10、101、1011、10111、101110 ;后缀就是空串、0、01、011、0111、01110、011101
二、设计窗口界面
进入vs,选择C#窗口应用,创建一个新的项目,然后就是设计一个窗口界面
1、字符串输入
想要获取输入的字符串,这里选择TextBox这个控件,直接在工具箱中选择这个控件,拖入到窗口中,然后放到你想要放的位置
2、执行按钮
执行按钮就是运行函数的按钮,通过这些函数来获取通过TextBox输入的字符串的前后缀以及子串,这里的控件就选择Button
3、结果输出
输出窗口就是输出经过运行函数后得到的结果,这里控件选用ListBox
4、退出窗口
退出按钮就是直接结束整个文件的运行,同样选用Button
这是最终设计结果的样图(可以按照自己的喜好来进行排版)
三、函数实现
在这里我们从难到易开始讲解,先是退出按钮的定义,然后是执行按钮的定义。
1、退出
在退出按钮上双击,进行这个按钮的定义,在这个按钮的函数中输入以下内容,就达到了我们的目的了
1 this.Close();
2、执行
在执行按钮中包含了许多的函数,用来对字符串进行前缀、后缀、子串的筛选,在这个版块中,首先讲解一下,我们自己定义的前后缀函数的含义
//前缀函数
private string[] prefix(string str)
{
int len = str.Length; //获取字符串的长度
string s = ""; //用于存放每一个元素
string[] result = new string[len]; //定义新的数组
for(int i=0;i<len;i++)
{
s = s + str[i]; //每次往后加一个字符
result[i] = s; //把结果存放到新的数组中
}
return result;
}
//后缀函数
private string[] suffix(string str)
{
int len = str.Length; //获取字符串长度
string s = ""; //用于存放每一个元素
string[] result = new string[len];//定义新的数组
for (int i = len - 1; i >= 0; i--)
{
s = str[i] + s; //每次从后往前加一个字符
result[len - 1 - i] = s; //把结果存放到新的数组
}
return result;
}
因为我已经在代码注释中详细解释了每一行的含义,这里就不再进行过多的赘述,所以接下来我们就直接讲述,对这两个函数的调用,以及输出结果
接下来所有的代码都是定义在执行按钮里的,也就是你要双击执行按钮,进入代码界面,找到执行的函数,然后在里面输入以下的代码
首先,是对于输入空字符串的警告(也就是你啥也没输入,就点击了执行,总要提醒让你输入)
if (text_input.Text == "")
{
MessageBox.Show("尚未输入字符!请重新输入。"); //显示警告提示窗
}
上面出现了if,那下面就少不了else,但是这个else里的内容比较多;
首先出现在else里的是对TextBox中内容的获取,在C++中就相当于cin
string str = text_input.Text;//获取用户输入的串
int len = text_input.Text.Length; //获取这串字符串的长度
string output_str = "串X = " + str;
result.Items.Add(output_str);//把文本值附加到listbox中
既然我们已经获取到了想要处理的字符串,那接下来就是把这串字符串送到我们之前定义的前后缀函数中进行处理,也就是输出,我们想要的前后缀字符串
//输出前缀及个数
string[] result_pre = prefix(str); //定义新的数组,存放前缀函数处理的内容
string output_pre = "X的前缀 = { "; //定义输出的格式
for(int i=0;i<len;i++) //循环输出上述新数组中的内容
{
output_pre = output_pre + result_pre[i] + ", ";
}
output_pre = output_pre + "空串 } 个数 = " + (len + 1); //这里对len加1 是因为还有一个空串
result.Items.Add(output_pre); //把结果添加到ListBox中,显示出来
//输出后缀及个数
string[] result_suf = suffix(str); //定义新的数组,存放前缀函数处理的内容
string output_suf = "X的后缀 = { "; //定义输出的格式
for (int i = 0; i < len; i++) //循环输出上述新数组中的内容
{
output_suf = output_suf + result_suf[i] + ", ";
}
output_suf = output_suf + "空串 } 个数 = " + (len + 1); //这里对len加1 是因为还有一个空串
result.Items.Add(output_suf); //把结果添加到ListBox中,显示出来
在上述输出前后缀代码中,对每一行代码都进行了详细的注释,这里也就不再进行过多的赘述,自行参悟
在输出了前缀、后缀之后,我们就需要输出最后的内容——子串
//输出子串及其个数
int max_res_index = ((1 + len) * len) / 2; //计算得出字串的最长长度
string[] result_son = new string[max_res_index]; //定义一个新的数组,长度为计算的长度
int res_index = 0;
for (int i = 0; i < len; i++)
{
string[] temp = prefix(str); //去掉一个字符之后的串的前缀
for (int j = 0; j < len - i; j++)
{
result_son[res_index] = temp[j];
res_index++;
}
str = str.Remove(0, 1);//删除开头的字符
}
经过上面的运算后,会发现会出现重复的子串,这里就要进行去重处理
//去重
for (int i = 0; i < max_res_index; i++)
{
for (int j = i + 1; j < max_res_index; j++)
{
if (result_son[i] == result_son[j])
{
for (int k = j + 1; k < max_res_index; k++)
{
result_son[k - 1] = result_son[k];
}
max_res_index--;
j--;
}
}
}
在完成所有的操作后,就要把得到的子串通过ListBox输出
string output_son = "X除前后缀之外的子串 = { ";
for (int i = 0; i < max_res_index - 1; i++)
{
output_son = output_son + result_son[i] + ", ";
}
output_son = output_son + result_son[max_res_index - 1] + " 空串 } 个数 = " + (max_res_index+1);
result.Items.Add(output_son);
因为和上面的代码类似,这里也就不解释了
到这里我们的执行按钮的所有代码就结束了这么多的内容都是在else里的,千万不要搞错了
以上所有内容就是本次实验的所有内容了。
最后给出我们做出来的最终结果
图片我也不知道怎么回事,全是椭圆形,就凑活着看吧!!!
C# 输出一个字符串的前缀、后缀和它的子串(信息内容安全 实验一)的更多相关文章
- poj1056(字符串判断是否存在一个字符串是另一个字符串的前缀)
题目链接:https://vjudge.net/problem/POJ-1056 题意:给定一个字符串集,判断是否存在一个字符串是另一个字符串的前缀. 思路:和hdoj1671一样,有两种情况: 当前 ...
- python-又来练习题--输出一个字符串中最长的子字符串及其长度
一.有个字符串 str= '$sd1#111$svda123!!!221&eSSDSyyyyyyDG^svda121^svda124^1111111111111' 包含特殊字符.数字和字母,输 ...
- java中输出一个字符串里面的空格,字母还有数字的数目举例说明
9.6 About string,"I am a teacher",这个字符串中有多少个字,且分别把每个字打印出来. /*本题的思路就是,当我有一个字符串,我需要一个一个字符的处理 ...
- Python习题-输出一个字符串中最长的子字符串及其长度
描述:有个字符串$sd1#111$svda123!!!221&eSSDSDG,包含特殊字符.数字和字母,输出最长的子字符串和他的长度#例如上面的字符串包含数字字母的字符串是svda123,长度 ...
- Python3基础 for循环 遍历并输出一个字符串的列表
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- yes - 不断输出一个字符串,直到杀死其为止
SYNOPSIS(总览) yes [OPTION]... [STRING]... DESCRIPTION(描述) 不断输出包括所有指定STRING(s)的一行,或者是`y'. --help 显示帮助并 ...
- StrStr,判断一个字符串是不是另一个字符串的字串,并返回子串的位置
public int strStr(String haystack, String needle) { if(haystack == null || needle == null) { return ...
- python输入一个字符串,输出翻转后的字符串(翻转字符串)
题目:输出一个字符串,输出翻转后的字符串.例如:输入字符串a123,输出321a. 方法一:使用列表的reverse方法 string=input('请输入一个字符串:') lst=list(stri ...
- AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)
如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...
随机推荐
- MacBook Pro 2019 13 inch & screen blink
MacBook Pro 2019 13 inch & screen blink MacBook Pro 闪屏 https://macreports.com/mac-how-to-trouble ...
- Flutter: 设置简单的启动屏
更多代码参考 有短暂的白屏时间 import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter ...
- 「NGK每日快讯」2021.1.4日NGK第62期官方快讯!
- NGK全球启动大会正式启动,资产上链的前景与机会在哪?
据彭博社报道,加州时间11月25日,NGK全球启动大会在美国硅谷圆满落幕,本次NGK全球启动大会为NGK全球化进程正式拉开了帷幕. 众多业界人士共襄盛举,共同进行探讨未来公链发展的去向和契机. 当前, ...
- ASP.NET Core WebApi版本控制
前言: 在日常项目开发中,随着项目需求不断的累加.不断的迭代:项目服务接口需要向下兼容历史版本:前些时候就因为Api接口为做版本管理导致接口对低版本兼容处理不友好. 最近就像了解下如何实现WebApi ...
- JS广度优先遍历
自己用JS实现了 广度优先遍历 第一种用了数组的高阶函数,看起来有些复杂.然后思索着从可读性上优化了一下,孰优孰劣以后分析. var list = [{ id: "ab", chi ...
- 一文了解Python的迭代器的实现
本文对迭代器的解释参考自:https://www.programiz.com/python-programming/iterator 最后自己使用迭代器实现一个公平洗牌类. 博主认为,理论来自实践,假 ...
- E: Some index files failed to download. They have been**
转: E: Some index files failed to download. They have been** 问题描述: 当使用Dockerfile从包含cuda的镜像建立新的image的时 ...
- MySQL深入研究--学习总结(2)
前言 接上文,继续学习后续章节. 第四章&第五章<深入浅出索引> 这两章节主要介绍的索引结构及其如何合理建立索引,但是我觉得讲的比较简单. 总结回顾下吧,其实在我之前的文章< ...
- java 集合 + 常见面试题
1.1. 集合概述 1.1.1. Java 集合概览 从下图可以看出,在 Java 中除了以 Map 结尾的类之外, 其他类都实现了 Collection 接口. 并且,以 Map 结尾的类都实现了 ...