一、截取字符串的实现
在C语言中,没有直接截取字符串的库函数,但是咱们可以借助其他函数实现这个功能。
1.最简单的方法
如果只是直接输出一个字符串的子串,只需要一个简单的printf函数即可。
#include <stdio.h>
int main() {
char s[]="Hello World!";
int n=5;
//从索引s+6开始,输出n个字符
printf("%.*s\n", n, s+6);
return 0;
}
程序输出:World
注:格式化说明符%.*s表示输出*个字符,*的值由后面的变量n指定,这样表示就可以输出不固定的字符个数。完整形式为%m.ns,表示打印字符宽度为m,字符个数为n,如printf("%3.1s\n",s)会输出两个空格1个H。
注意宽度m不是限宽,而是最小宽度。就像停车场上的停车位一样,不是只有m个停车位,而是只画了m个停车位。
也就是说,当n<m时,前面补空格,当n>m时,会正常输出n个字符(不会被截断)。这个特性和浮点数的输出宽度和小数位数规律完全一样。
printf("%s", "good") | g | o | o | d | |
printf("%5s", "good") | g | o | o | d | |
printf("%.2s", "good") | g | o | |||
printf("%3.2s", "good") | g | o | |||
printf("%4.2s", "good") | g | o | |||
printf("%1.2s", "good") | g | o |
2.利用strncpy函数
strncpy定义在 <string.h> 头文件中,功能是将一个字符串(包括终止的空字符)从源字符串复制到目标字符串。与strcpy不同的是,它可以指定复制字符的数量(中间有个字母n就表示要复制n个)。
函数的原型:
char *strncpy(char *dest, const char *src, size_t n);
参数说明:
dest:指向目标字符串的指针,即你要将源字符串复制到的位置。
src:指向源字符串的指针,即你要从中复制字符串的位置。
n:要复制的字符的最大数量。
返回值:
strncpy 函数返回目标字符串 dest 的指针。
代码如下:
#include <stdio.h>
#include <string.h>
void substring(char *src, char *dest, int start, int length) {
if (start < 0 || length <= 0 || start + length > strlen(src)) {
printf("Invalid parameters!\n");
return;
}
// 使用strncpy函数复制子字符串到目标字符串
strncpy(dest, src + start, length);
// 在目标字符串的末尾添加空字符
dest[length] = '\0';
}
int main() {
char src[] = "Hello, World!";
char dest[10];
// 截取从索引7开始的8个字符
substring(src, dest, 7, 5);
printf("%s\n", dest);
return 0;
}
3.自编代码
其实strncpy实现起来非常简单,完全可以自己写,只需要将要截取的元素逐个赋值到目标数组即可。可将上面的那行strncpy代码替换如下:
for(int i=0; i<length; i++){
dest[i]=src[i+start];
}
二、截取字符串的应有案例
搞一个截取字符串的简单应用案例:“名言生成器”。
咱们都知道这样一句名言:
还有一句躺平人的心声:
咱们可以把这两句话进行截取重拼来搞搞新意思,代码如下:
#include <stdio.h>
int main() {
char s1[]="生如夏花之绚烂,死如秋叶之静美。";
char s2[]="打工可能累死!玩命可能猝死!躺平最多饿死!";
printf("%.26s", s1);
printf("%.4s。\n", s2+28);
return 0;
}
猜猜会输出什么结果?
注:实际测试,一个中文字符相当于两个英文字符,所以格式化输出时参数值相对于纯英文要翻倍。
当然了,这只是个最简单的应用案例。如果我们从大量的名人名言中随机截取片段,然后将它们重新组合成全新的句子,在有人工智能算法的加持下,就可能产生一些非常好玩的句子。