一、什么是前后缀

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

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

  举例:比如 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、执行

    在执行按钮中包含了许多的函数,用来对字符串进行前缀、后缀、子串的筛选,在这个版块中,首先讲解一下,我们自己定义的前后缀函数的含义

  1. //前缀函数
  2. private string[] prefix(string str)
  3. {
  4. int len = str.Length; //获取字符串的长度
  5. string s = ""; //用于存放每一个元素
  6. string[] result = new string[len]; //定义新的数组
  7. for(int i=0;i<len;i++)
  8. {
  9. s = s + str[i]; //每次往后加一个字符
  10. result[i] = s; //把结果存放到新的数组中
  11. }
  12. return result;
  13. }
  1. //后缀函数
  2. private string[] suffix(string str)
  3. {
  4. int len = str.Length; //获取字符串长度
  5. string s = ""; //用于存放每一个元素
  6. string[] result = new string[len];//定义新的数组
  7. for (int i = len - 1; i >= 0; i--)
  8. {
  9. s = str[i] + s; //每次从后往前加一个字符
  10. result[len - 1 - i] = s; //把结果存放到新的数组
  11. }
  12. return result;
  13. }

因为我已经在代码注释中详细解释了每一行的含义,这里就不再进行过多的赘述,所以接下来我们就直接讲述,对这两个函数的调用,以及输出结果

接下来所有的代码都是定义在执行按钮里的,也就是你要双击执行按钮,进入代码界面,找到执行的函数,然后在里面输入以下的代码

首先,是对于输入空字符串的警告(也就是你啥也没输入,就点击了执行,总要提醒让你输入)

  1. if (text_input.Text == "")
  2. {
  3. MessageBox.Show("尚未输入字符!请重新输入。"); //显示警告提示窗
  4. }

上面出现了if,那下面就少不了else,但是这个else里的内容比较多;

首先出现在else里的是对TextBox中内容的获取,在C++中就相当于cin

  1. string str = text_input.Text;//获取用户输入的串
  2. int len = text_input.Text.Length; //获取这串字符串的长度
  3. string output_str = "串X = " + str;
    result.Items.Add(output_str);//把文本值附加到listbox中

既然我们已经获取到了想要处理的字符串,那接下来就是把这串字符串送到我们之前定义的前后缀函数中进行处理,也就是输出,我们想要的前后缀字符串

  1. //输出前缀及个数
  2. string[] result_pre = prefix(str); //定义新的数组,存放前缀函数处理的内容
  3. string output_pre = "X的前缀 = { "; //定义输出的格式
  4. for(int i=0;i<len;i++) //循环输出上述新数组中的内容
  5. {
  6. output_pre = output_pre + result_pre[i] + ", ";
  7. }
  8. output_pre = output_pre + "空串 } 个数 = " + (len + 1); //这里对len加1 是因为还有一个空串
    result.Items.Add(output_pre); //把结果添加到ListBox中,显示出来
  1. //输出后缀及个数
  2. string[] result_suf = suffix(str); //定义新的数组,存放前缀函数处理的内容
  3. string output_suf = "X的后缀 = { "; //定义输出的格式
  4. for (int i = 0; i < len; i++) //循环输出上述新数组中的内容
  5. {
  6. output_suf = output_suf + result_suf[i] + ", ";
  7. }
  8. output_suf = output_suf + "空串 } 个数 = " + (len + 1); //这里对len加1 是因为还有一个空串
  9. result.Items.Add(output_suf); //把结果添加到ListBox中,显示出来

在上述输出前后缀代码中,对每一行代码都进行了详细的注释,这里也就不再进行过多的赘述,自行参悟

在输出了前缀、后缀之后,我们就需要输出最后的内容——子串

  1. //输出子串及其个数
  2. int max_res_index = ((1 + len) * len) / 2; //计算得出字串的最长长度
  3. string[] result_son = new string[max_res_index]; //定义一个新的数组,长度为计算的长度
  4. int res_index = 0;
  5. for (int i = 0; i < len; i++)
  6. {
  7. string[] temp = prefix(str); //去掉一个字符之后的串的前缀
  8. for (int j = 0; j < len - i; j++)
  9. {
  10. result_son[res_index] = temp[j];
  11. res_index++;
  12. }
  13. str = str.Remove(0, 1);//删除开头的字符
  14. }

经过上面的运算后,会发现会出现重复的子串,这里就要进行去重处理

  1. //去重
  2. for (int i = 0; i < max_res_index; i++)
  3. {
  4. for (int j = i + 1; j < max_res_index; j++)
  5. {
  6. if (result_son[i] == result_son[j])
  7. {
  8. for (int k = j + 1; k < max_res_index; k++)
  9. {
  10. result_son[k - 1] = result_son[k];
  11. }
  12. max_res_index--;
  13. j--;
  14. }
  15. }
  16. }

在完成所有的操作后,就要把得到的子串通过ListBox输出

  1. string output_son = "X除前后缀之外的子串 = { ";
  2. for (int i = 0; i < max_res_index - 1; i++)
  3. {
  4. output_son = output_son + result_son[i] + ", ";
  5. }
  6. output_son = output_son + result_son[max_res_index - 1] + " 空串 } 个数 = " + (max_res_index+1);
  7. 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. 高阶函数 HOF & 高阶组件 HOC

    高阶函数 HOF & 高阶组件 HOC 高阶类 js HOC 高阶函数 HOF 函数作为参数 函数作为返回值 "use strict"; /** * * @author x ...

  2. Android 如何使用 WebView 加载 HTML 字符串和处理转译字符

    Android 如何使用 WebView 加载 HTML 字符串和处理转译字符 css bug 在 WebView 中编译 Web 应用 如果您希望在客户端应用中提供 Web 应用(或只是网页),则可 ...

  3. vue & watch props

    vue & watch props bug OK watch: { // props // chatObj: () => { // // bug // log(`this.chatObj ...

  4. c++ 获取当前程序的主模块句柄

    char text[2014]; GetModuleBaseNameA(GetCurrentProcess(), 0, text, 1024); HMODULE hModule = GetModule ...

  5. css ::selection 选择文本改变样式

    .p1::selection{ background: red; color: #fff; }

  6. Flutter 获取本地图片并剪切

    安装依赖 dependencies: ... image_picker: image_cropper android\app\src\main\AndroidManifest.xml 将UCropAc ...

  7. Python算法_整数反转(02)

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321 示例 3: 输入: 120 输出: 2 ...

  8. 深入理解Linux TCP backlog

    本文转载自深入理解Linux TCP backlog 当应用程序调用listen系统调用让一个socket进入LISTEN状态时,需要指定一个参数:backlog.这个参数经常被描述为,新连接队列的长 ...

  9. SpringBoot读取配置文件的内容

    1.@Value读取 在springboot项目中,如果要读取配置文件application.properties或application.yml文件的内容,可以使用自带的注解@Value.以prop ...

  10. Linux安装jdk(两种方式)

    最近在研究大数据方面的东西,业务场景是从设备采集数据经过处理然后存放DB. 建设上面的环境第一步肯定是安装jdk,所以和大家一起学一下基本知识centos7.5安装jdk1.8. 安装jdk有两种方法 ...