一道面试题引发的关于c语言中文件操作的总结

C语言文件/流函数getc/putc,gets/puts, fgetc/fputc, fputs,fprintf一篇文章全记住 C语言字符、字符串操作函数。文件/流函数。putchar, getchar, puts和gets ,fputs, fgets, putc, getc, fgetc, fputc, printf, sprintf, fprintf, scanf( ) 和sscanf( ) 阅读详情
一、引言
最近在准备面试的过程中,找到了一道难度不是很大的面试题,以此来进行文件操作相关函数以及用法的总结,面试题是这么讲的:
请编写程序:从键盘输入一个字符串,将其中的小写字母全部转化为大写在吗,输出到磁盘文件“upper.txt"中保存。输入的字符串以”!“结束。然后,再将文件upper.txt中的内容读出显示在屏幕上。
初看此题觉得不是很难,写代码的时候发现自己久疏战阵,很多文件操作的用法有点生疏,下面我们来一一总结,搞清楚他们。

二、C语言文件操作的函数

1、getchar()
2、putchar()
3、getc()
4、putc()
5、gets()
6、puts()
7、getch()
8、putch()
7、fgetchar()
8、fputchar()
9、fgetc()
10、fputc()
11、fgets()
12、fputs()
13、fread()
14、fwrite()
15、fscanf()
16、fprintf()
三、函数的用法
我们分别来说明以上函数的用法,输入和输出成对的来说明
1、getchar和putchar()
getchar() 和putchar()函数作用于输入输出流,分别是等待输入流输入字符,以及输出流输出字符;
getchar():等待键盘输入字符,字符输入后并不立即返回,而是将字符放置于缓冲区中,等待换行符,遇到换行符后函数返回,一个字符一个字符从缓冲区中读取字符,直到从缓冲区读完所有字符。
putchar(int _Ch):该函数向输出流来输出一个字符。
oid get_putcharFun()
{
char ch;
ch = getchar();
while(ch != '!')
{
putchar(ch);
ch = getchar();
}


return ;
}

getc(FILE *file):如果是从标准输入读取字符则和getchar()没有任何的区别,函数形式为getc(stdin);
                 看函数形式,我们还可以从文件中读取字符,每次读取一个字符,知道文件末尾EOF字符,在此处并不是以换行符作为终止符,而是文件终止符;
putc(int _Ch, FILE *fp):如果是向标准输入读取字符则和putchar()没有任何的区别,函数形式为putc(ch,stdout);
                          看函数形式,我们还可以向文件写入字符,每次写入一个字符。

void get_putcFun()
{
	//标准输入输出的代码,和getchar,putchar函数没有区别
	/*char ch = getc(stdin);
	while (ch != '!')
	{
		putc(ch,stdout);
		ch = getc(stdin);
	}
	*/

	//测试文件输入输出时的用法
	char msg[] = "jkjkdjsaksksajksjksjclk%";
	FILE *fp = fopen("file.txt", "at+");
	if(fp == NULL)
	{
		printf("open falied\n");
		return;
	}
	char ch;
	while((ch = getc(fp)) != EOF)
	{
		putc(ch, stdout);
	}
	int len = strlen(msg);
	int i = 0;
	while(len > 0)
	{
		putc(msg[i],fp);
		len--;
		i++;
	}
	fclose(fp);
	return ;
}
3、getch()和putch()
这一对函数比较特殊,需要包含"conio.h"而不是"stdio.h"头文件,两个用法如下:
getch():给函数是等待标准键盘输入,每次输入一个字符后就立即返回,且不进行回显,即你在输入界面时看不到你正在输入的字符,
          这点和getchar以及getc(stdin)有区别主要是以下方面:
 * getchar()和getc(stdin)输入时要进行回显;
 * getchar()和getc(stdin)输入时并不是立即返回,等待换行符然后返回,getch()则是读入到一个字符后立即返回,并不是等待换行符的输入。
putch(int _Ch):该函数是向标准输出输入一个字符和putchar和puc(ch,stout)并没有什么区别。
void get_putchFun()
{
	char ch;
	while((ch = getch())!='!')
	{
		//putc(ch, stdout);
		putch(ch);
	}
	return;
	//getch();
}
4、gets()和puts()
gets函数时从标准输入读取一行,遇到换行符则返回,并且将换行符也读入到字符缓冲区里面;
puts()向标准输出输出一行数据,并且最后自动添加换行符。
void get_putsFun()
{
	char buffer[256] = {0};
	gets(buffer);
	puts(buffer);

}
5、fgetchar()和fputchar()
这两个函数哈getchar和putchar并没有任何区别,但是一般都是使用getchar和putchar进行操作;
void fget_fputcharFun()
{
	char ch;
	while((ch = fgetchar())!='!')
	//putc(ch, stdout);
	fputchar(ch);

	return;
}
6、fgetc和fputc
这两个函数其实就是getc和putc中的输入输出文件版本,例子如下:
void fget_fputcFun()
{
	char msg[] = {"uuuuuuuuuuuuuuuuuuuuuuuuuuuu"};
	FILE *fp = fopen("file.txt", "at+");
	if(fp == NULL)
	{
		return;
	}
	char ch;
	while((ch = fgetc(fp))!=EOF)
	{
		putc(ch, stdout);
	}
	int len = strlen(msg);
	int i = 0;
	while(len > 0)
	{
		putc(msg[i], fp);
		len--;
		i++;
	}
		fclose(fp);
	return;
}

七、fgets和fputs函数
fgets:从打开的文件中读取一行,放入到缓冲区;
fputs:向打开的文件写入一行数据。
代码如下:

oid fgets_fputsFun()
{
	char buffer[1024];
	char outBuffer[1024] = "OOOOOOOOOOOOOOOO";
	FILE *fp = fopen("file.txt","at+");
	if(fp == NULL)
	{
		return;
	}
	while(fgets(buffer, sizeof(buffer), fp) != NULL)
	{
		printf(buffer);
	}
	fputs(outBuffer,fp);
	fclose(fp);
	return;
}
八、fread函数和fwrite函数
fread():
从文件中读取字符放到缓冲区中,
原型为:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
        size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 
返回值:读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录
数小于nmemb,也可能返回0。
如下面代码进行测试
void fread_fwriteFun()
{
	char buffer[100] = {0};
	char writeBuffer[1024] = {"VVVVVVVVVVVVVVVVVVKKKZZZZZZZZZZZZZGGGGGGGGGGGGGSSz"};
	FILE *fp = fopen("file.txt", "r");
	if(fp == NULL)
	{
		return;
	}
	fseek(fp, 0, SEEK_END);
	int lengths = ftell(fp);
	fseek(fp,0,SEEK_SET);
	char *pBuffer = new char[lengths];
	int len = fread(pBuffer,1 , lengths, fp);
	pBuffer[len] = '\0';
	if(len)
	{
		printf(pBuffer);
		printf("FILE p offset:%d\n", (int)ftell(fp)); 
	}
	fclose(fp);

}
void fwrite_Fun()
{
	FILE *fp = fopen("file.txt", "a+");
	if(fp == NULL)
	{
		return;
	}
	char writeBuffer[1024] = {"VVVVVVVVVVVVVVVVVGGGVOPOPJHHHz"};
	fseek(fp, 0, SEEK_SET);
	int len = strlen(writeBuffer);
	int lengths = fwrite(writeBuffer, 1, len, fp);
	printf("FILE fp offset:%d\n", (int)ftell(fp));
	fseek(fp, 0, SEEK_SET);
		fclose(fp);
}


void printFun()
{
	FILE *fp = fopen("file.txt", "a+");
	if(fp == NULL)
	{
		return;
	}
		char ch;
		while((ch = getc(fp)) != EOF)
		{
			putc(ch, stdout);
		}
}
注意;在使用以上函数的时候要特别注意指针的是指向,以及指针的当前位置,否则很容易造成读写文件时候的造成乱码。
九、fscanf和fprintf函数
fscanf和fprintf函数主要是用来向文件进行格式输入输出的函数,函数原型如下:
int fscanf(FILE *stream, char *format,[argument...])
int fprintf( FILE *stream, const char *format, [argument...];

void fprintfFun()
{
	struct Test {
		int num;
		int last;
		double point;
		float extra;
	};
	struct TestStr {
		int num;
		int last;
		double point;
		char extra[16];
	};
	struct Test tset[4] = { { 12,33,90.2,88.7 },{ 15,44,99.6,34.8 },{ 20,55,89.9,67.5 },{ 44,66,88.4,44.5 } };
	struct TestStr tsetStr[4] = { { 12,33,90.2,"ssss" },{ 15,44,99.6,"dddd" },{ 20,55,89.9,"ffff" },{ 44,66,88.4,"hhhh" } };

	char buffer[1024] = { 0 };
	FILE *fp = fopen("test.txt", "at+");
	if (fp == NULL)
	{
		printf("open failed\n");
		return;
	}
	for (int i = 0; i < 4; i++)
	{
		//fprintf(fp, "%d,%d,%f,%f\n", tset[i].num, tset[i].last, tset[i].point, tset[i].extra);
		fprintf(fp, "%d,%d,%f,%s\n", tsetStr[i].num, tsetStr[i].last, tsetStr[i].point, tsetStr[i].extra);
	}
	fclose(fp);
}

void fscanfFun()
{
	FILE *fp = fopen("test.txt", "r");
	if (fp == NULL)
	{
		return;
	}
	//fseek(fp, 0L, SEEK_SET);
	int number = 0;
	float points = 0.0;
	float extras = 0.0;
	int last;
	char str[16] = {0};
	//while (fscanf(fp, "%d,%d,%f,%f\n", &number, &last, &points, &extras) == 4)
	//{
	//	printf("%d,%d,%f,%f\n", number, last, points, extras);
	//}
	while (fscanf(fp, "%d,%d,%f,%s\n", &number, &last, &points, &str) == 4)
	{
		printf("%d,%d,%f,%s\n", number, last, points, str);
	}
	fclose(fp);
}
十、总结

文件的操作不管是在c语言还是c++都是必须要掌握的基础内容,再以后的学习中要多多的实践。

C语言面试核心考点与实战技巧解析 内存管理和指针操作是C语言的核心特性,直接影响程序性能和稳定性。理解内存对齐原理能优化数据结构布局,提升缓存命中率;掌握函数指针机制可实现灵活的回调系统,这在驱动开发和事件处理中尤为重要。通过qsort等标准库的深度剖析,开发者能学习到泛型编程的思想。在嵌入式领域,volatile关键字和位域操作是硬件交互的关键技术。现代C语言开发还需关注类型安全(如静态断言)和性能优化(如循环展开)。这些技术广泛应用于操作系统开发、物联网设备、高频交易等场景,是2023年大厂C语言面试的重点考察方向。 阅读详情

相关推荐

C语言面试核心考点解析:内存、指针与底层编程精髓

内存管理和指针操作是编程语言中的基础概念,它们直接关系到程序的性能、稳定性和安全性。理解内存布局、堆栈分配、指针运算等原理,是掌握底层系统编程和性能优化的关键。这些技术价值在于能够帮助开发者编写出高效、可靠的代码,尤其在嵌入式系统、操作系统内核、高性能计算等对资源控制要求严格的场景中至关重要。本文围绕C语言面试中的高频考点,深入剖析了内存对齐、函数指针、const关键字等核心难点,并结合实际开发中的内存泄漏防范、缓冲区溢出等常见问题,提供了系统的解决方案和避坑指南,助力开发者夯实基础,提升技术内功。

weixin_34026276的博客 385

C中文件操作相关函数

 文件操作.2007-03-24 00:55 @函数名称:      fputchar函数原型:      int fputchar(int ch)函数功能:      在标准输出流(即屏幕上)的当前位置写入一个字符函数返回:      操作正确时返回写入的字符,错误返回EOF参数说明:      c

xujianxin's 优快云 Blog 1595

2024年大数据最新C C++学习路线总结与分享(1),算法真题解析:美团+Tencent+字节跳动+阿里+360+拼多多

在优快云上认识了很多学习C/C++在校朋友,他们在和我交流时时常会问有没有好的C/C++学习路线推荐,目前的博客内容主要面向有工作经验的人,针对初学者的文章写的比较少。因为大家问的比较多,最近正好有时间,就详细地思考了一下这个学习路线的问题。作为IT行业的从业者,结合多年的实战经验,给大家大概地总结一下C/C++学习路线方面的内容,以供广大C/C++初学者借鉴和参考!C/C++的知识点与学习路线图总体如下所示:在这里,给大家(该专栏订阅量接近350个,有很强的实战参考价值,广受好评!

2301_79099434的博客 1192

C语言清除输入缓存方法记录

fflush()函数是标准的作法。 setbuf(stdin,NULL)是GCC下可用的一种方法。 scanf("%*[^\n]%*c")是用扫描集将缓冲区中的字符全部读取来实现清除缓冲区的动作。 我最近在ubuntu下写一个程序,涉及到了这方面的问题。用fflush()和setbuf(stdin,NULL)都没有解决掉缓存的问题。 (奇怪的错误,DT地不想调试。)后来,搜到有

fengyouyu的专栏 1975

2024年最新C C++学习路线总结与分享(2),2024年最新字节跳动架构师讲解大数据开发开发

在优快云上认识了很多学习C/C++在校朋友,他们在和我交流时时常会问有没有好的C/C++学习路线推荐,目前的博客内容主要面向有工作经验的人,针对初学者的文章写的比较少。因为大家问的比较多,最近正好有时间,就详细地思考了一下这个学习路线的问题。作为IT行业的从业者,结合多年的实战经验,给大家大概地总结一下C/C++学习路线方面的内容,以供广大C/C++初学者借鉴和参考!C/C++的知识点与学习路线图总体如下所示:在这里,给大家(该专栏订阅量接近350个,有很强的实战参考价值,广受好评!

2301_82243318的博客 842

Java面试题

JVM(Java虚拟机)是一种可以执行Java字节码的虚拟机。它是一种规范,不同的供应商可以实现自己的版本。当我们运行一个Java程序时,JVM会将字节码转换为特定平台的机器码。JDK(Java开发工具包)是一个用于开发Java应用程序的工具集合,包括编译器、调试器和运行时环境。JRE(Java运行时环境)是一个运行Java应用程序的环境,包括JVM和核心类库。面向对象编程(OOP)是一种编程范式,它使用对象和类来表示数据和操作。OOP的主要概念包括封装、继承和多态。

weixin_47560724的博客 540

C语言中使用while循环清理缓冲区

C语言中使用while循环清理缓冲区

amina2000的博客 1053

华三C语言笔试通关必备真题解析与知识点精讲

函数是C语言中最基本的抽象单元之一,它封装了一段具有特定功能的代码块,支持重复使用和逻辑分离。一个完整的函数由函数头(包括返回类型、函数名和参数列表)和函数体组成。函数的正确声明、定义与调用不仅关系到程序能否编译通过,更直接影响程序的性能、可读性和安全性。原则说明✅ 避免返回局部变量地址栈内存不可靠✅ 动态分配内存需明确所有权谁分配谁释放,或文档说明✅ 错误码优先于断言断言用于调试,错误码用于生产环境✅ 使用枚举定义返回状态提高可读性,如。

weixin_31597759的博客 324

10-6-1 写文章(*) (10 分)

10-6-1 写文章(*) (10 分) 请编写函数,从键盘输入一篇文章,将其写入到文件中。 函数原型 void WriteArticle(FILE *f); 说明:参数 f 为文件指针。函数从键盘输入一篇文章(由若干行文字组成,以 Ctrl+Z 结束),将其写入 f 所指示的文件中。 裁判程序 #include <stdio.h> #include <stdlib.h> void WriteArticle(FILE *f); int main() { FILE *f;

weixin_50934744的博客 1587

编写程序,该程序实现打开一个文本文件,每次读取一行内容,将每行作为一个字符串读入,并将字符串输出显示到屏幕上。

编写程序,该程序实现打开一个文本文件,每次读取一行内容,将每行作为一个字符串读入,并将字符串输出显示到屏幕上。

mongoDB 数据莫名其妙的没了

问题 之前没有接触过mongoDB,然后接手一个项目使用的是MongoDB,我就跟着网上的教程搭建一个MongoDB的服务,并运行起来。 一开始没有啥问题,成功的把服务与MongoDB都启动以来,运行也没有问题。但是过了几天,我再次打开时发现,以前的数据神奇的消失了。我还在想,是有什么定时清除的么,还是什么原因导致崩了然后数据就被清理了。 查找原因 第一次遇到我没有在意,重启了一下MongoDB,...

技术熊的博客小窝 1万+

c语言中文件读写面试题,一道面试题引发的关于c语言中文件操作的总结

一、引言最近在准备面试的过程中,找到了一道难度不是很大的面试题,以此来进行文件操作相关函数以及用法的总结,面试题是这么讲的:请编写程序:从键盘输入一个字符串,将其中的小写字母全部转化为大写在吗,输出到磁盘文件“upper.txt"中保存。输入的字符串以”!“结束。然后,再将文件upper.txt中的内容读出显示在屏幕上。初看此题觉得不是很难,写代码的时候发现自己久疏战阵,很多文件操作的用法有点生疏...

weixin_30653091的博客 374

STM32F407通过FSMC接口与LAN9252的EtherCAT从站移植实战

本文详细介绍了在STM32F407平台上,通过FSMC接口驱动LAN9252 EtherCAT从站控制器的完整移植实战。内容涵盖硬件连接、FSMC时序配置、官方SDK代码分析与关键修改、EtherCAT协议栈集成适配,以及实战调试与稳定性优化技巧,旨在帮助工程师解决工业通信中的核心挑战,实现稳定高效的实时控制网络接入。

weixin_29268267的博客 274

C&C++公司面试题 - 答案

C&C++公司面试题答案

qq_48290779的博客 422

Linux CentOS7文件系统(/dev/var)的容量扩充

原因是之前安装docker后,再想安装Nessus,系统说home、var文件系统的内存都不够。

JHoanna的博客 3224

【QT开发教程】Qt的图形用户界面设计模式:MVC/MVP/MVVM

在Qt框架中,图形用户界面(GUI)的设计模式对于提高代码的可维护性、可扩展性和可测试性至关重要。MVC(Model-View-Controller)、MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel)是常见的三种设计模式。本文将详细介绍这三种设计模式在Qt中的应用。

科技改变人类,技术成就未来 1474

手机上怎么运行html代码,手机上怎么运行c语言

Python作为一门简洁而强大的编程语言,广泛应用于数据分析、Web开发、人工智能等领域。

LY2036的博客 680

机器视觉应用工程师职位深度解析与面试指南

广东奥普特科技招聘机器视觉应用工程师,要求大专以上理工科专业背景,熟悉C/C++或PLC编程,具备自动化设备调试经验。岗位职责包括视觉项目方案评估、系统安装调试、售后技术支持及异常处理,需接受外派出差。该职位面向专业对口的应届生或实习生,强调动手能力、沟通技巧和吃苦耐劳精神。机器视觉工程师需掌握图像处理算法、硬件配置等核心技术,在工业自动化领域具有良好发展前景。求职者应注重编程能力和实践经验的积累,以胜任这一技术密集型岗位。

郑伟强dev的专栏 431

大数据最新C C++学习路线总结与分享

在优快云上认识了很多学习C/C++在校朋友,他们在和我交流时时常会问有没有好的C/C++学习路线推荐,目前的博客内容主要面向有工作经验的人,针对初学者的文章写的比较少。因为大家问的比较多,最近正好有时间,就详细地思考了一下这个学习路线的问题。作为IT行业的从业者,结合多年的实战经验,给大家大概地总结一下C/C++学习路线方面的内容,以供广大C/C++初学者借鉴和参考!C/C++的知识点与学习路线图总体如下所示:在这里,给大家(该专栏订阅量接近350个,有很强的实战参考价值,广受好评!

2401_84186109的博客 838

OpenClaw 预置技能完全指南

OpenClaw 技能(Skills)是扩展 AI 助手能力的插件系统。🔐 管理密码和敏感信息(1Password)📝 操作 Apple Notes 和 Reminders🔍 实时搜索互联网(Brave Search)🎨 生成和编辑图片(Nano Banana Pro)📧 收发邮件(Himalaya)🏠 控制智能家居(OpenHue、Eight Sleep)💬 发送消息(iMessage、WhatsApp、Slack)🎵 控制音乐播放(Spotify、Sonos)

Maynor的博客 1703

2024全国村级行政边界数据

五级行政区划:村边界数据产品涵盖五级行政区划:(一级行政区)省级行政区共31个其中:(台湾、香港、澳门除外);(二级行政区)地级行政区共334个其中:7个地区、3个盟、30个自治州、294个地级市;(三级行政区)县级行政区共2851个其中:1355个县、117个自治县、49个旗、3个自治旗、363个县级市、962个市辖区、1个林区、1个特区;(四级行政区)乡级行政区共40497个其中:11626个乡、1034个民族乡、20117个镇、7566个街道、151个苏木、1个民族苏木、2个县辖区公所;

J_Giser的博客 3228

C# 基础面试题(万字)

的是?

夜飞鼠的专栏 3409

【Claude】权限被拒绝 (Permission Denied) 全场景排查 — 已解决

权限配置是 Claude Code 安全使用的核心机制。通过合理的 allow/deny 规则、正确的通配符使用、子代理独立配置、定期安全审计,可以在保证安全性的同时不影响开发效率。deny 优先:deny 规则优先级高于 allow,先保护敏感资源通配符精确单层匹配,**递归匹配,Bash(cmd*)允许带参数最小权限:只允许必要的操作,避免Bash(*)等危险规则CI 用 skip:Headless 模式用避免挂起子代理独立:每个子代理单独配置权限,不自动继承保护密钥:deny.env。

一键难忘的博客 3935

C/C++输入输出深度解析:从缓冲区到文件操作,掌握I/O核心机制

输入输出(I/O)是程序与外界交互的基础,它通过流模型实现数据在内存与外部设备间的传输。其核心原理在于缓冲机制,通过暂存数据批量处理来平衡效率与实时性,这是理解程序响应速度的关键。在技术价值上,稳健的I/O处理直接决定了程序的可靠性与性能,尤其在资源受限或高并发场景下至关重要。应用场景广泛,从控制台交互、文件读写到网络通信都依赖于此。本文将聚焦C/C++的I/O系统,深入探讨**缓冲区**的工作机制与**文件操作**的实践要点,帮助开发者规避常见陷阱,构建高效可靠的数据处理逻辑。

weixin_28454475的博客 347

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JAVA面试题集收藏大放送

1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程...

阿楠的博客 333

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C C++学习路线总结与分享

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。如果你需要这些资料,可以戳这里获取需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!inux客户端的开发。

2401_85011985的博客 562

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: 二维数组和指针之间的关系详解
drlmemory
博客等级 码龄14年 15粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值