一、什么是前后缀

 字符串的前缀:符号串左部的任意子串(或者说是字符串的任意首部)

  字符串的后缀:符号串右部的任意子串(或者说是字符串的任意尾部)

  举例:比如 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# 输出一个字符串的前缀、后缀和它的子串(信息内容安全 实验一)的更多相关文章

  1. poj1056(字符串判断是否存在一个字符串是另一个字符串的前缀)

    题目链接:https://vjudge.net/problem/POJ-1056 题意:给定一个字符串集,判断是否存在一个字符串是另一个字符串的前缀. 思路:和hdoj1671一样,有两种情况: 当前 ...

  2. python-又来练习题--输出一个字符串中最长的子字符串及其长度

    一.有个字符串 str= '$sd1#111$svda123!!!221&eSSDSyyyyyyDG^svda121^svda124^1111111111111' 包含特殊字符.数字和字母,输 ...

  3. java中输出一个字符串里面的空格,字母还有数字的数目举例说明

    9.6 About string,"I am a teacher",这个字符串中有多少个字,且分别把每个字打印出来. /*本题的思路就是,当我有一个字符串,我需要一个一个字符的处理 ...

  4. Python习题-输出一个字符串中最长的子字符串及其长度

    描述:有个字符串$sd1#111$svda123!!!221&eSSDSDG,包含特殊字符.数字和字母,输出最长的子字符串和他的长度#例如上面的字符串包含数字字母的字符串是svda123,长度 ...

  5. Python3基础 for循环 遍历并输出一个字符串的列表

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  6. yes - 不断输出一个字符串,直到杀死其为止

    SYNOPSIS(总览) yes [OPTION]... [STRING]... DESCRIPTION(描述) 不断输出包括所有指定STRING(s)的一行,或者是`y'. --help 显示帮助并 ...

  7. StrStr,判断一个字符串是不是另一个字符串的字串,并返回子串的位置

    public int strStr(String haystack, String needle) { if(haystack == null || needle == null) { return ...

  8. python输入一个字符串,输出翻转后的字符串(翻转字符串)

    题目:输出一个字符串,输出翻转后的字符串.例如:输入字符串a123,输出321a. 方法一:使用列表的reverse方法 string=input('请输入一个字符串:') lst=list(stri ...

  9. AcWing:139. 回文子串的最大长度(字符串Hash + 前缀和 + 后缀和 + 二分)

    如果一个字符串正着读和倒着读是一样的,则称它是回文的. 给定一个长度为N的字符串S,求他的最长回文子串的长度是多少. 输入格式 输入将包含最多30个测试用例,每个测试用例占一行,以最多1000000个 ...

随机推荐

  1. Building an IMAP Email Client with PHP

    1 Building an IMAP Email Client with PHP http://www.toptal.com/php/building-an-imap-email-client-wit ...

  2. web 前端工具: Gulp 使用教程

    1 1 1 Gulp 使用教程: 1 1 1 1 1 1 1 1 ERROR: ./app.js 当前目录路径: ./ 当前目录路径: ./ 1 1 1 1 1 参考资源: http://webpac ...

  3. API 授权 All In One

    API 授权 All In One 身份验证 授权类型 身份验证类型 继承认证 没有认证 API密钥 不记名令牌 基本认证 摘要授权 OAuth 1.0 OAuth 2.0 授权码 隐含的 密码凭证 ...

  4. Vue Learning Paths

    Vue Learning Paths Vue Expert refs https://vueschool.io/articles/vuejs-tutorials/exciting-new-featur ...

  5. HTML5 QRCode Scaner

    HTML5 QRCode Scaner how to scan QR Code using the camera of the phone or website live demo https://c ...

  6. GitHub Actions

    GitHub Actions CI/CD & testing https://github.com/features/actions refs xgqfrms 2012-2020 www.cn ...

  7. 大送福利!市场香饽饽VAST到底什么来头,为何被高价估值

    近日,NGK星空计划新币VAST成为了香饽饽,还未正式上线前,市场讨论的热度就居高不下.如今NGK推出1万VAST免费送新人福利更是将这波热度推向了高潮. 具体福利规则:在美国加州时间2021年2月8 ...

  8. NGK新加坡峰会:超级节点和开源代码为DeFi生态带来新曙光!

    据伦敦金融时报以及纽约商业报等多家媒体报道的消息,1月31日,2021 NGK区块链峰会于新加坡正式开幕,全球多位区块链研究所专家线上受邀出席参会,NGK灵石技术研发Clifton先生,法国区块链专家 ...

  9. PBN旁切转弯的精确化计算

    PBN转弯保护区中使用频率最高的当属旁切转弯,风螺旋的精确算法会对旁切转弯的绘制带来哪些变化,通过今天这个例子我们来了解一下. 图III-3-2-3 旁切转弯保护区   一.基础参数: ICAO816 ...

  10. [Python] 茎叶图和复合饼图的画法

    目录 茎叶图 复合饼图 茎叶图 from itertools import groupby nums2=[225, 232,232,245,235,245,270,225,240,240,217,19 ...