深度剖析C语言中字符串函数的坑点与细节,并且总结归纳

华为OD机试C/D卷备考指南:真题解析与多语言实战策略 数据结构与算法是计算机科学的核心基础,其原理在于通过高效组织和管理数据,优化问题求解过程。掌握经典数据结构(如哈希表、图)和算法思想(如动态规划、搜索)的技术价值在于,能显著提升软件性能与资源利用率,是解决大规模数据处理、路径规划、资源调度等复杂工程问题的关键。在求职面试、尤其是像华为OD这类大厂的技术机试中,对算法与数据结构的深入理解和熟练应用是重要的考察维度。本文聚焦华为OD机试的C卷与D卷,通过解析【社交网络相同爱好好友查询】等真题场景,结合【倒排索引】等核心思想,提供从考情分析、备考规划到多语言(J 阅读详情

一.字符串函数

在 C 语言中,包含 string.h 这个头文件的库函数有不少,而且用起来也很便捷,但其中有坑的东西也不在少数,所以,我向大家来介绍一下这个头文件中好用的函数与需要注意的地方

 1.字符串拷贝函数

strcpy字符串拷贝函数,将后面的字符串拷贝到前面的字符串,遇见\0停止

这个函数的形式如下

char * strcpy (char *dest,const char * src)

返回值是 char*,也就是说,这个函数会返回一个字符串指针,参数有两个,都是 char*类型的,代表了接收类型只有字符串指针类型,而且注意到,第二个指针前加了 const,而且还是在解引用操作符之前,这代表了,src 指向的内容不可被修改(但是可以修改 src 指向的对象,这是关于指针的内容,如果有不熟悉的可以去翻一下我写指针的博客),那么这样做是为什么呢?可以借助于这两个指针的名字来更好的理解,destination(目的地),source(源头),其意思就是将源头的内容放到目的地里,那既然我们要做到完整的 copy,那么src 的内容我们是不希望被修改的,所以加上 cosnt 修饰,这样一来,我们就能够完整的了解到这个函数了

我给出这个代码的实现

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	//1.找到目标空间中的\0
	while (*dest != '\0')
	{
		dest++;
	}
	//2.数据的拷贝
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

2.字符串拼接函数

trcat 字符串拼接函数,将后面的字符串移到前面的字符串的\0后拼接,直到\0停止

char * strcat (char * dest,const char *src)

这个函数可以理解为将 源头 src 的字符串拷贝到目的地 dest 的字符串\0之后的位置

同样我也给出代码实现

char * my_strcat(char *dest,const char *src)
{
    assert(dest && src);
    char *ret = dest;
    //找到目标位置的\0
    while(*dest != 0)
    {
        dest++;
    }
    //赋值运算
    while(*dest++ = *src++)
    ;
    return ret;
}

相信大家看到了这两个的代码实现之后,会有一种一头雾水或者叹为观止的感觉

while(*dest ++ = *src ++)

在我刚接触到这串代码时,我也是直呼牛逼,让我们来剖析

while循环语句,判断条件为真假,在 C/C++语言中,0 表示假,非 0 表示真,所以当*scr 为 0 时,while 结束,所以当源头的字符串拷贝完遇到了\0,将这些值都赋值给了 dest,循环就结束了,而这里也用到了++单目操作符,后置++,先进行使用,再进行++,这样以来,就可以将所有\0之前的字符都进行拷贝和拼接;

3.字符串比较函数

strcmp函数,比较字符串\0之前的大小

而且这种比较是看对应字符的ASIC 码值

int strcmp (const char * str1,const char * str2)

当 *str1 > *str2 的时候,会返回 大于 0 的数

当 *str1 < *str2 的时候,会返回小于 0 的数

当*str1  = *str2 的时候,会返回 0

以下是函数的实现

int my_strcmp(const char *str1,const char *str2)
{
    assert(str1 && str2);
    while(*str1 == *str2)
    {
        if(*str1 == 0)
        {
            return 0;
        }
        str1++;
        str2++;
    }
    if(*str1>*str2)     return 1;
    if(*str2>*str1)     return -1;
}

以上的函数,都有 strn 版本例如,strncpy,strncmp,strncat,这个三个函数可以指定字符串的大小只需要在两个指针参数后跟上要比较的数量就可以了

4。字符串查找子串函数

char * strstr (const char *str1, cosnt char *str2)

这个 strstr 函数可以在寻找字符串子串,而子串的意思是str2 的这个字符串在 str1 中第一次出现的位置,并返回这个字符串的地址

再次给出实现

char * my_strstr(const char* str1,const char * str2)
{
    //暴力查找法
    const char *s1 = NULL;
    const char *s2 = NULL;
    const char *cur = str1;
    while(*cur)
    {
        s1 = cur;
        s2 = str2;
        while(*s1 != 0 && *s2 != 0 && *s1 == *s2)
        {
            s1++;
            s2++;
        }
        if(*s2 == 0)
        return (char *)cur;
        cur++;
    }      
    return NULL

在这里,我简单的讲一下查找逻辑,因为返回的是首次找到子串的地址,所以要有一个指针来标记子串,而另外两个指针来匹配字符串的内容,因为当标记指针是 0 时,也就代表已经遍历完了整个被查找字符串,而且不知道循环的次数,所以用 while 循环,进入循环,开始匹配,如果两个字符相等就往后查询,如果不想等,那么标记就需要往后走,再次匹配,当被查找字符串走到\0时,也就代表着已经找到了子串,返回标记的地址。

以上是查找逻辑,为暴力查找,如果要提升性能,可以用 kmp 算法来优化,有兴趣的可以了解一下。

5.分隔字符串函数

strtok,这个函数可以用来分隔一些字符串的内容

char * strtok ( char * str, const char * delimiters );

这个函数可以用来分隔一些字符串,比如邮箱号

d2025440304@gmail.com

就可以将@和.分隔的三个部分提取出来

d2025440304

gmail

com

而这个函数的使用逻辑是,找到了第一个分隔符,比如@,下次使用时第一个指针就要传为空指针,而第二个就是分隔符指针,如下

#include <string.h>
int main()
{
    char arr[] = "daixiangyu@2007.0304";
    char arr2[] = {0};
    strcpy(arr2,arr);
    const char *sep = "@.";
    char *ret =NULL;
    for(ret = strtok(arr2,sep);ret!=NULL;ret = strtok(NULL,sep))
    {
        printf("%s\n",ret);
    }
    return 0;
}

这样利用 for 循环的方式,就可以巧妙的将三个分隔符的内容分别打印出来

好了,已上就是字符串函数的内容所有精华,如有不妥与,请各位指教

                                                                                                                谢谢大家

 

        

 

木马攻击深度剖析:从原理到防御的实战指南 恶意软件,特别是木马程序,是网络安全领域持续面临的核心威胁。其工作原理通常涉及利用系统漏洞或社会工程学手段植入,通过进程注入、代码混淆等技术实现隐蔽执行,并建立命令与控制(C2)信道进行远程操控。理解其技术原理对于构建有效的安全防御体系至关重要,其价值在于能够将被动响应转变为主动检测与防御。在应用场景上,无论是企业安全运维、应急响应还是恶意软件分析,掌握木马的分析与对抗技术都是从业者的核心能力。本文聚焦于**木马攻击**的完整生命周期,深入拆解其**免杀技术**、持久化手段与C2通信机制,旨在为安全工程师提 阅读详情

相关推荐

Python后门攻击深度剖析:从供应链污染到内存驻留的防御实战

在软件开发生命周期中,供应链安全已成为现代应用安全的核心议题。其原理在于攻击者通过污染软件依赖、开发工具或构建环境,将恶意代码植入合法软件的分发渠道。这种攻击模式的技术价值在于能够实现大规模、自动化的渗透,影响范围从单个应用到整个生态系统。典型的应用场景包括开源软件仓库投毒、CI/CD管道入侵和开发工具链劫持等。本文聚焦于Python生态中的后门威胁,深入解析攻击者如何利用PyPI包污染、模块导入劫持和依赖混淆等技术,构建从初始植入到命令控制(C2)通信的完整攻击链,并探讨针对内存驻留和无文件攻击的检测与防

weixin_42525738的博客 296

C语言期末核心考点与避坑指南:从指针内存到文件操作实战解析

在计算机编程领域,内存管理和指针操作是理解底层系统运行机制的核心概念。指针作为内存地址的引用,其本质是实现了对数据的间接访问,这一原理构成了C语言高效性和灵活性的基础。掌握指针与数组、结构体的结合使用,以及动态内存分配(malloc/free),对于构建复杂数据结构和实现资源高效管理具有重要技术价值。这些技术广泛应用于系统编程、嵌入式开发、算法实现等场景,是衡量程序员对计算机体系结构理解深度的重要标尺。本文聚焦C语言期末复习,针对指针、数组、字符串、内存管理等高频易错点,结合典型算法和文件操作,提供系统化的

weixin_34209851的博客 481

从零开始学数据结构:软考算法题避坑指南(含KMP算法详解)

本文为软考软件设计师考生提供数据结构与算法的实战避坑指南。文章深度剖析了KMP算法的核心原理与实现,帮助考生理解如何避免暴力匹配的低效陷阱,并系统梳理了树、图、排序等高频考点,旨在提升解题效率与算法思维。

weixin_29280219的博客 197

主流编程语言条件与循环语句的底层实现原理深度剖析

条件与循环语句作为程序控制流的核心,其底层实现是语言设计哲学的集中体现:C/C++ 追求极致的性能和底层控制,Java/C# 平衡性能与安全,Python 追求易用性和灵活性,JavaScript 适配动态场景的高效执行。 理解不同语言条件 / 循环语句的底层差异,不仅能帮助开发者写出更高效、更安全的代码,更能深入理解 “语法 - 编译 - 执行” 的完整链路,建立从高层语法到底层机器指令的思维映射,这也是从 “初级开发者” 迈向 “高级开发者” 的关键一步。

candy的博客 661

Java算法竞赛进阶:蓝桥杯国赛核心算法与高效训练心法

算法是计算机科学的核心基础,其本质是通过一系列指令高效解决特定问题的计算方法。理解算法的核心原理,如分治、动态规划、贪心、搜索等,是构建高效程序的关键。在工程实践中,算法的价值在于优化程序的时间与空间复杂度,解决大规模数据处理、路径规划、资源调度等实际问题。对于Java开发者而言,在算法竞赛和工程开发中,掌握常见算法模型并规避语言特性陷阱至关重要。本文聚焦于蓝桥杯国赛这一典型场景,深入剖析动态规划、图论搜索等高频考点,并探讨如何通过系统训练将算法知识内化为解题直觉。文中将结合快速幂、A*算法等具体技术,分享

weixin_34242331的博客 332

VISA 标准深度剖析:寄存器基控制规范与函数接口研究

VISA标准作为仪器控制的核心API,通过分层设计将各类总线细节封装为统一接口。文章系统性地将VISA函数划分为8大功能类别:资源管理类(建立通信通道)、基本I/O类(数据读写)、格式化I/O类(高级数据处理)、内存/寄存器I/O类(底层硬件控制)、事件处理类(异步响应)、属性控制类(参数配置)、接口总线类(特定总线控制)和资源锁定类(多线程安全)。针对消息基和寄存器基两种典型仪器控制场景,文章详细解析了各类函数的应用方法和调用流程,特别强调寄存器基控制在高性能数据采集和嵌入式系统中的关键作用。掌握这套分类

u014344410的博客 277

C语言考研真题精解:从指针内存到实战调试的编程进阶指南

C语言作为编程的基石,其核心在于对计算机内存的直接操作与高效管理。理解指针与内存管理原理,是掌握C语言的关键,这直接关系到程序的性能、安全性与资源效率。在工程实践中,无论是嵌入式开发、系统编程还是算法实现,扎实的C语言基础都至关重要。通过分析字符串处理、数组遍历、动态内存分配等高频应用场景,可以深入巩固指针运算、内存布局及数据结构基础等核心概念。本文聚焦于考研真题这一高浓度实践样本,精选涉及指针、内存管理与调试技巧的经典题目,通过深度剖析与代码实现,帮助学习者构建系统化的知识网络,有效提升解决实际编程问题的

weixin_32932149的博客 258

Android高级逆向研发工程师:核心技术深度剖析与面试指南

摘要:本文深入解析Android高级逆向研发工程师岗位的核心技术能力要求,包括逆向分析、系统底层开发、源码定制构建等关键技能。详细剖析静态/动态分析、Hook技术、DEX注入等逆向方法,以及Framework/HAL层开发要点。提供涵盖基础概念、系统底层、编程能力的面试题库及参考答案,帮助工程师掌握ARM汇编分析、Binder通信监控等高级技能。文章还展望了AI辅助逆向、自动化分析平台等前沿趋势,为从业者提供全面的技术发展路径和面试准备指导。

郑伟强dev的专栏 649

从欢聚时代iOS校招C卷看Objective-C与Runtime核心考点

在iOS开发中,Objective-C和Runtime是绕不开的底层基石,更是校招与社招面试中高频考察的技术栈。理解内存管理、引用计数、消息转发与RunLoop机制,不仅有助于分析属性关键字、block循环引用等经典问题,也能为多线程并发和性能优化提供扎实的理论支撑。从直播、IM等高实时互动场景到列表流畅度优化,这些原理始终贯穿于工程实践。本文通过复盘一份2017年欢聚时代iOS工程师校招笔试卷,梳理其题型结构与出题逻辑,提炼出依然适用于当今面试的常青知识点,帮助开发者建立系统化的底层认知,从而在技术面试与

weixin_33796177的博客 307

最新Docker GPU支持全解析:为什么nvidia-smi能用但PyTorch找不到CUDA?

本文深入解析了Docker容器中nvidia-smi命令可用但PyTorch无法调用CUDA的根本原因。关键在于默认配置仅暴露了GPU的utility管理能力,而CUDA计算所需的compute能力未被激活。通过正确设置NVIDIA_DRIVER_CAPABILITIES环境变量为compute,utility,并配合--gpus参数,即可解决此问题,确保AI训练等任务顺利进行。

convnet3designer的博客 240

mac安全干净卸载Anaconda3

主要原因是python命令没有映射到已经安装的python版本上,则需要添加。修改~/.bash_profile文件,将anaconda相关删除。现在想卸载Anaconda,恢复使用mac系统自带的Python。最后在mac的应用目录删除Anaconda。查看所有版本的python所在安装目录。或者不使用软连接映射,也可使用。再次查看python映射。查看python版本。建立软连接,添加映射。

buyue 5962

C/C++面试核心:从内存管理到多线程的底层原理与实战解析

在系统级编程领域,内存管理与并发控制是构建高性能、高可靠性软件的基石。理解内存模型、指针与引用的本质,是掌握C/C++这类底层语言的关键,它直接关系到程序的效率与稳定性。其技术价值在于,开发者能够精准控制资源,编写出高效且安全的代码,这对于操作系统、数据库、游戏引擎等核心基础设施的开发至关重要。在实际应用中,无论是避免内存泄漏、理解数据对齐,还是实现线程安全的资源访问,都需要扎实的底层知识。本文聚焦于C/C++面试中的高频考点,深入剖析**指针与引用**的底层区别、**多线程**环境下的同步机制与陷阱,以及

weixin_33882452的博客 323

ArcMap投影变换避坑指南:为什么你的坐标转换总出错?常见问题解析与解决方案

本文深入解析ArcMap中坐标转换与投影变换的核心区别与常见陷阱。针对坐标转换总出错的问题,从混淆“定义投影”与“投影变换”、栅格数据重采样选择、矢量数据地理变换参数设置等关键环节,提供清晰的避坑指南与实战解决方案,帮助用户确保空间数据的精确匹配。

weixin_29210727的博客 356

从PTA题目看算法优化:回文字符串判断的三种实现方式对比

本文以PTA经典题目为例,深入对比了回文字符串判断的三种实现方式:递归、双指针和字符串反转。重点分析了双指针法在时间复杂度、空间开销和工程实践上的综合优势,并提供了根据实际场景选择最优算法的实用指南。

xxx12的博客 753

Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库

本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO)

2201_76125261的博客 1382

C#与倍福Plc通信——使用仿真软件模拟倍福PLC运行

安装这个软件之前先安装VisualStudio,本文安装这个软件时已经安装了VisualStudio2019。1、下载倍福PLC编程软件TwinCAT。

qq_34059233的博客 3664

深度剖析数据在内存中的存储

本章节只是较复杂,覆盖的很全面,非常适合深入探究,一定要自己手敲代码,并且自己去感受,当成复习资料也是很不错的后期博主会陆续更新如有不足之处欢迎补充交流!!

chaodddddd的博客 392

INFFUS 2025 | DDBFusion:基于双重分解和贝塞尔曲线的统一图像分解与融合框架

现有的图像融合算法大多集中于网络架构和损失函数的设计,采用统一的特征提取策略,却忽略了冗余信息和有效信息的划分。然而,对于互补信息而言,统一的特征提取器可能并不适用。因此,本文提出了一种基于贝塞尔曲线图像增强和分层分解的统一图像融合算法,并构建了一个自监督学习任务来学习有意义的信息。其中,贝塞尔曲线旨在模拟不同的图像特征,并构建特殊的自监督学习样本,因此作者的方法不需要特定任务的数据,并且可以在公共自然图像数据集上轻松进行训练。同时,作者的双重分解自监督训练方法可以为模型赋予冗余信息过滤能力。

小白学视觉 308

蓝桥杯Java选手如何高效利用C++题单:算法迁移与实战解析

算法竞赛的核心在于算法思想与解题逻辑,而非特定编程语言的语法细节。动态规划、贪心算法、搜索剪枝等核心思想具有普适性,其状态定义、策略证明与逻辑框架与语言无关。掌握这些基础算法原理,对于解决各类计算问题、优化程序性能具有重要价值,广泛应用于数据处理、系统优化和人工智能等领域。在蓝桥杯等算法竞赛中,选手常需借鉴不同语言社区的优质资源,例如将流传更广的C++题解思路迁移至Java实现。这一过程的关键在于理解算法内核,而非逐行翻译代码。通过剖析高僧斗法等经典博弈论问题,可以深入理解尼姆博弈的变形与异或运算的应用;而

weixin_33836874的博客 379

通过WorkVisual连接KUKA机器人的具体方法

通过WorkVisual连接KUKA机器人的具体方法

Robot_PLC_HMI_Automation 6843

化工过程设计软件:Aspen Plus二次开发_(2).二次开发概述

假设我们需要创建一个自定义的换热器模型,该模型能够计算两个物流之间的热交换量,并根据传热系数和换热面积进行调整。ACM 模型代码示例!自定义换热器模型!参数:传热系数 U (W/m^2·K)!换热面积 A (m^2)!热物流 T_hot_in (K), T_hot_out (K), F_hot (kmol/h)!冷物流 T_cold_in (K), T_cold_out (K), F_cold (kmol/h)!模型输入!U - 传热系数!A - 换热面积!

kkchenjj的博客 370

蓝桥杯Java决赛备赛指南:核心算法、实战技巧与避坑策略

算法竞赛是检验编程与问题解决能力的有效途径,其核心在于将复杂问题抽象为可计算的模型,并运用高效的数据结构与算法求解。动态规划和广度优先搜索(BFS)是解决最优化与路径查找问题的关键技术,前者通过状态转移方程分解问题,后者通过队列实现层序遍历。在Java工程实践中,掌握集合框架、输入输出优化以及递归、回溯等编程范式,能显著提升代码效率与可靠性。这些能力在如蓝桥杯等算法竞赛中尤为重要,参赛者需构建多维能力模型,并通过真题驱动进行系统性训练。本文以蓝桥杯Java大学C组决赛为具体场景,深入剖析了备赛战略、核心算法

weixin_33831673的博客 451

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

MATLAB基础综合练习:从语法掌握到工程思维跃迁

在科学计算与工程领域,掌握一门工具的核心在于建立系统化的计算思维,而非仅仅记忆语法命令。MATLAB作为矩阵实验室,其核心原理在于高效的矩阵运算与向量化操作,这能显著提升数据处理与算法实现的性能。掌握数据索引、流程控制、函数封装及可视化等基础技术,对于构建可复用的分析工具和自动化工作流具有重要价值,广泛应用于信号处理、控制系统、图像分析及机器学习等场景。本文通过典型练习剖析,深入讲解如何避免常见‘坑点’如数组维度错误,并强调向量化操作相对于低效循环的性能优势,帮助学习者从‘会做题’转向‘会做事’,实现真正的

weixin_34345753的博客 810

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

VS2022中scanf报错全解析:从C4996到缓冲区溢出的解决方案

在C/C++编程中,输入输出是基础且关键的操作,而标准输入函数scanf则是初学者最先接触的核心函数之一。其工作原理是通过格式字符串解析用户输入,并将数据存储到指定变量中。然而,由于传统scanf函数在设计上缺乏边界检查机制,容易引发缓冲区溢出等安全漏洞,这正是现代编译器如Visual Studio 2022默认将其标记为不安全的原因。从技术价值角度看,安全编程已成为工业级开发的必备要求,编译器通过报错强制开发者采用更安全的替代方案。在实际应用场景中,尤其是在教学与工程实践的交叉领域,这种安全标准与教材传统

weixin_33744854的博客 415

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++面试错题集:从概念到实战的避坑指南

在C++编程领域,内存管理和多态机制是构建高效、稳定软件系统的核心基础。内存管理涉及栈与堆的生命周期、智能指针的引用计数原理,理解这些概念能有效避免野指针和内存泄漏问题。多态机制通过虚函数表和虚函数指针实现动态绑定,掌握对象构造析构顺序和override关键字的使用,是设计可扩展面向对象系统的关键。这些技术不仅提升了代码的健壮性和性能,更在嵌入式系统、游戏引擎、高频交易等对资源控制和实时性要求极高的场景中体现价值。本文围绕C++面试中的高频易错点,结合C++八股文和嵌入式面试等热点,深入剖析内存管理、多态、

weixin_33834628的博客 307

CVE-2021-4034漏洞深度剖析:从Linux权限提升原理到实战攻防

Linux系统中的权限提升漏洞是系统安全的核心威胁之一,其本质在于特权程序对用户输入验证的缺失。这类漏洞通常利用环境变量、命令行参数等进程启动参数的边界条件,诱使SUID程序执行非预期操作。CVE-2021-4034(PwnKit)正是此类漏洞的典型代表,它通过操控`argv`与`environ`的内存布局,使`pkexec`错误解析环境变量,进而利用`GCONV_PATH`机制加载恶意共享库。该漏洞的技术价值在于揭示了Linux底层API交互的隐蔽风险,其利用链精巧地串联了多个系统组件。在应用场景上,此类

612
上一篇: 《大一新生 Mac 生产力折腾记:从游戏本到 MacBook Air M4 + Git 环境全配置》
下一篇: C 语言中函数的高效学习方法实操在内存函数中
DDXYcoder
博客等级 码龄1年 140粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值