C语言高效获取并输出字符串子串的算法

需积分: 0 2 下载量 36 浏览量 更新于2024-08-04 1 收藏 878B TXT 举报
在C语言编程中,字符串子串的输出是一个常见的任务,尤其是在处理用户输入和数组操作时。本篇代码提供了一个实现方法,用于从一个给定的字符数组中提取并打印出指定长度的子串。主要涉及到以下几个知识点: 1. **头文件**: `#include <stdio.h>`:这个头文件包含了标准输入输出函数,如`printf`和`scanf`,它们在程序中被用来获取用户输入和控制输出。 2. **主函数**: `int main()`:这是C程序的入口点,所有的程序执行逻辑都从这里开始。 3. **变量声明**: - `int n, m, t;`:整型变量n和m用于存储用户输入的两个长度值,t是n与m的差,用于计算子串的结束位置。 - `int i, j;`:这两个整型变量在循环中迭代使用。 - `char a[21];`:字符数组a用于存储用户输入的字符串。 - `int s[20] = {0};`:整型数组s用于存放子串的索引,初始化为0,表示从字符串开始。 4. **用户输入**: `printf("请输入n和m的值:");` 和 `scanf("%d%d", &n, &m);`:提示用户输入n和m的值,并读取到相应的变量中。`fflush(stdin)`用于清空输入缓冲区,避免因为输入多个字符而产生的意外影响。 5. **子串提取**: - `for (i = 0; i < n; i++) a[i] = getchar();`:用户以字符串形式输入字符,直到输入n个字符。 - `for (j = 0; j < m; j++) printf("%c", a[s[j]]);`:第一次循环打印前m个字符,即原始子串。 6. **滑动窗口算法**: 当提取的子串长度不足以覆盖整个输入字符串时,代码进入了一个while循环,利用滑动窗口的概念来逐步增加子串的长度。这部分的关键在于更新数组`s`,确保子串始终位于字符串的有效范围内。具体步骤如下: - `s[m-1]++;`:每次循环,将最后一个元素(子串的右边界)向右移动一位。 - `for (i = m - 1; i >= 1; i--)`:检查相邻元素是否需要调整。 - `if (s[i] > t + i)`:当当前索引的值超出有效范围时,将其前面的索引减一。 - 再次调整子串的起始位置: - `for (i = 1; i <= m - 1; i++)`: - `if (s[i] > t + i) s[i] = s[i - 1] + 1;` - `for (j = 0; j < m; j++)`: - `printf("%c", a[s[j]]);`:更新子串并打印。 7. **返回0**: `return 0;`:主函数执行完毕,程序正常退出。 总结来说,这段代码展示了如何使用C语言通过用户输入和滑动窗口算法来获取和打印字符数组中的子串。它在实际编程中非常实用,特别是处理动态大小的子串需求时,可以灵活调整子串的长度。