截取字符串的3种方法

一、截取字符串的实现

在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;
}

猜猜会输出什么结果?

注:实际测试,一个中文字符相当于两个英文字符,所以格式化输出时参数值相对于纯英文要翻倍。

当然了,这只是个最简单的应用案例。如果我们从大量的名人名言中随机截取片段,然后将它们重新组合成全新的句子,在有人工智能算法的加持下,就可能产生一些非常好玩的句子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金创想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值