C语言函数大全-- v 开头的函数

news2025/2/28 19:52:25

C语言函数大全

本篇介绍C语言函数大全-- v 开头的函数

1. va_start

1.1 函数说明

函数声明函数功能
void va_start(va_list ap, last_arg);用于初始化一个 va_list 类型的变量,使其指向可变参数列表中的第一个参数

参数:

  • ap: 一个指向 va_list 类型的变量的指针,表示要初始化的可变参数列表
  • last_arg: 一个指向最后一个固定参数的指针,用于确定可变参数列表的起始位置

1.2 演示示例

#include <stdio.h>
#include <stdarg.h>

void print_args(int count, ...) 
{
    va_list args1, args2;
    int i;

    va_start(args1, count); /* 初始化可变参数列表 */

    /* 复制可变参数列表 */
    va_copy(args2, args1);

    for (i = 0; i < count; i++) 
    {
        int arg1 = va_arg(args1, int); /* 获取下一个参数 */
        int arg2 = va_arg(args2, int);
        printf("arg[%d] = %d %d\n", i, arg1, arg2);
    }

    va_end(args2); /* 清理复制的可变参数列表 */
    va_end(args1); /* 清理原始可变参数列表 */
}

int main() 
{
    print_args(3, 10, 20, 30);
    return 0;
}

在上面的示例代码中,

  • 我们首先调用自定义的 print_args() 函数,并传入了 4 个入参,第一个为 可变参数的个数,后面三个为具体的整数型可变参数。
  • 然后在print_args() 函数内部,我们首先定义了两个 va_list 类型的变量 args1args2,并使用 va_start() 函数初始化 args1 变量。
  • 接着,我们使用 va_copy() 函数将 args1 复制到 args2 中,并使用 for 循环和 两个 va_arg() 函数来分别访问这两个可变参数列表,并依次输出每个参数的值。
  • 最后,我们使用两次 va_end() 函数来清理这两个可变参数列表。

1.3 运行结果

在这里插入图片描述

2. va_arg

2.1 函数说明

函数声明函数功能
type va_arg(va_list ap, type);用于从可变参数列表中获取下一个参数,并将其转换为指定的类型

参数:

  • ap : 一个指向 va_list 类型的变量的指针,表示要访问的可变参数列表
  • type : 一个类型说明符,表示下一个参数的类型

2.2 演示示例

可参考 1.2 中所示

3. va_copy

3.1 函数说明

函数声明函数功能
void va_copy(va_list dest, va_list src);用于将一个 va_list 类型的变量复制到另一个变量中

参数:

  • dest : 一个指向 va_list 类型的变量的指针,表示目标可变参数列表
  • src : 另一个指向 va_list 类型的变量的指针,表示要被复制的可变参数列表

3.2 演示示例

可参考 1.2 中所示

4. va_end

4.1 函数说明

函数声明函数功能
void va_end(va_list ap);用于清理一个 va_list 类型的变量

参数:

  • ap: 一个指向 va_list 类型的变量的指针,表示要清理的可变参数列表

4.2 演示示例

可参考 1.2 中所示

5. vfprintf

5.1 函数说明

函数声明函数功能
int vfprintf(FILE *stream, const char *format, va_list arg);用于将格式化输出写入到指定的文件流中

参数:

  • stream : 要写入数据的文件流指针
  • format : 格式化字符串,用来指定要输出的内容和格式
  • arg : 一个 va_list 类型的变量,包含了可变参数列表

5.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

FILE *fp;

int vfpf(const char *fmt, ...)
{
    va_list argptr;
    int cnt;

    va_start(argptr, fmt);
    cnt = vfprintf(fp, fmt, argptr);
    va_end(argptr);

    return cnt;
}

int main()
{
    int inumber;
    float fnumber;
    char string[4];

    fp = tmpfile();
    if (fp == NULL)
    {
        perror("tmpfile() call");
        exit(1);
    }

    vfpf("%d %f %s", 30, 90.0, "abc");

    rewind(fp);
    
    fscanf(fp,"%d %f %s", &inumber, &fnumber, string);
    
    printf("%d %.2f %s\n", inumber, fnumber, string);
    
    fclose(fp);

    return 0;
}

在上述的示例代码中,

  • 我们首先声明了三个变量 inumberfnumberstring
  • 然后,调用 tmpfile() 函数创建一个临时文件,并将返回的文件指针赋值给全局变量 fp。如果创建文件失败,则打印错误信息并退出程序;
  • 接着,调用自定义的 vfpf() 函数来向临时文件中写入数据。它里面使用 vfprintf() 函数将格式化输出写入到一个文件流中;
  • 再然后,调用 rewind() 函数将文件指针重新定位到文件开头;
  • 再接着使用 fscanf() 函数从文件中读取数据,并使用 printf() 函数中输出从文件中读取的数据【其中浮点数部分保留两位小数】
  • 最后调用 fclose() 函数关闭文件指针,并结束程序

5.3 运行结果

在这里插入图片描述

6. vfscanf

6.1 函数说明

函数声明函数功能
int vfscanf(FILE *stream, const char *format, va_list arg);用于将指定文件流中的格式化输入读取到指定变量中

参数:

  • stream : 要读取数据的文件流指针
  • format : 格式化字符串,用来指定要读取的内容和格式
  • arg : 一个 va_list 类型的变量,包含了可变参数列表

返回值:

  • 如果读取成功,返回成功读取并赋值给变量的项目数;
  • 如果出现错误,则返回负数。

6.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

FILE *fp;

int vfsf(const char *fmt, ...) {
    va_list argptr;
    int cnt;

    va_start(argptr, fmt);
    cnt = vfscanf(fp, fmt, argptr);
    va_end(argptr);

    return cnt;
}

int main()
{
    int inumber;
    float fnumber;
    char string[4];

    fp = tmpfile();
    if (fp == NULL)
    {
        perror("tmpfile() call");
        exit(1);
    }

    fprintf(fp, "%d %f %s", 30, 90.0, "abc");

    rewind(fp);
    
    vfsf("%d %f %s", &inumber, &fnumber, string);

    printf("%d %.2f %s\n", inumber, fnumber, string);

    fclose(fp);

    return 0;
}

在上面的示例代码中,

  • 我们首先声明了三个变量 inumberfnumberstring
  • 然后,程序调用 tmpfile() 函数创建一个临时文件,并将返回的文件指针赋值给全局变量 fp。如果创建文件失败,则打印错误信息并退出程序;
  • 接着,我们使用 fprintf() 函数将三个数据(一个整型数字、一个浮点数和一个字符串)写入该文件中;
  • 再然后,调用 rewind() 函数将文件指针重新定位到文件开头;
  • 再接着,我们调用自定义的 vfsf() 函数,里面使用 vfscanf() 函数从文件中读取数据;
  • 最后,打印出从文件中读取的数据,并关闭临时文件,退出程序。

6.3 运行结果

在这里插入图片描述

7. vprintf

7.1 函数说明

函数声明函数功能
int vprintf(const char *format, va_list ap);它使用格式化字符串 format 中的指令来指定输出的格式,并将后续的可变参数按照指令指定的格式输出到标准输出流 stdout

参数:

  • format : 格式化字符串,用来指定要打印的内容和格式
  • va_list : 一个 va_list 类型的变量,包含了可变参数列表

7.2 演示示例

#include <stdio.h>
#include <stdarg.h>

void myprint(const char *format, ...) 
{
    va_list args;
    va_start(args, format);
    vprintf(format, args);
    va_end(args);
}

int main() 
{
    int a = 10;
    float b = 3.14;
    char s[] = "hello";
    
    myprint("a=%d, b=%.2f, s=%s\n", a, b, s);
    return 0;
}

在上面的示例代码中,

  • 我们首先定义了三个变量 整形 a 、浮点型 b 和 字符数组 s
  • 然后,调用自定义的 myprint() 函数将这些变量的值输出到标准输出流 stdout 中;
    myprint() 函数中,
    • 我们首先使用 va_start() 宏初始化一个 va_list 变量 args
    • 然后调用 vprintf() 函数将格式化字符串和参数列表传递给该函数进行输出;
    • 最后使用 va_end() 宏清理 args 变量。
  • 最后结束程序。

7.3 运行结果

在这里插入图片描述

8. vscanf

8.1 函数说明

函数声明函数功能
int vscanf(const char *format, va_list arg);它使用格式化字符串 format 中的指令来指定输入的格式,并从标准输入流 stdin 中读取数据,并将数据按照指令指定的格式存储到相应的变量中

参数:

  • format : 格式化字符串,用来指定要读取的内容和格式
  • va_list : 一个 va_list 类型的变量,包含了可变参数列表

8.2 演示示例

#include <stdio.h>
#include <stdarg.h>

void myscan(const char *format, ...) 
{
    va_list args;
    va_start(args, format);
    vscanf(format, args);
    va_end(args);
}

int main() 
{
    int a;
    float b;
    char s[10];
    
    myscan("%d%f%s", &a, &b, s);
    printf("a=%d, b=%.2f, s=%s\n", a, b, s);
    return 0;
}

在上面的示例代码中,

  • 我们首先定义了三个变量 整形 a 、浮点型 b 和 字符数组 s
  • 然后,调用自定义的 myscan() 函数从标准输入流 stdin 中读取数据,并将数据存储到这些变量中
    myscan() 函数中,
    • 我们首先使用 va_start() 宏初始化一个 va_list 变量 args
    • 然后调用 vscanf() 函数将格式化字符串和参数列表传递给该函数进行输入;
    • 最后使用 va_end() 宏清理 args 变量。
  • 最后我们打印输出上面输入的两个变量的数据,并结束程序。

8.3 运行结果

在这里插入图片描述

9. vsprintf

9.1 函数说明

函数声明函数功能
int vsprintf(char *str, const char *format, va_list ap);它使用格式化字符串 format 中的指令来指定输出的格式,并将后续的可变参数按照指令指定的格式输出到字符数组 str 中。

参数:

  • str: 用来存储格式化数据的字符数组的指针
  • format : 格式化字符串,用来指定要输出的内容和格式
  • va_list : 一个 va_list 类型的变量,包含了可变参数列表

9.2 演示示例

#include <stdio.h>
#include <stdarg.h>

void myprint(const char *format, ...) 
{
    char buffer[100];
    va_list args;
    va_start(args, format);
    vsprintf(buffer, format, args);
    va_end(args);
    printf("%s", buffer);
}

int main() 
{
    int a = 10;
    float b = 3.1415;
    char s[] = "huazie";
    
    myprint("a=%d, b=%.4f, s=%s\n", a, b, s);
    return 0;
}

在上面的示例代码中,

  • 我们首先定义了三个变量 整形 a 、浮点型 b 和 字符数组 s
  • 然后,调用自定义的 myprint() 函数将格式化字符串和这些变量的值输出到字符数组 buffer 中,并打印输出字符数组 buffer
    myprint() 函数中,
    • 我们首先使用 va_start() 宏初始化一个 va_list 变量 args
    • 然后调用 vsprintf() 函数将格式化字符串和参数列表传递给该函数进行输出,并将输出结果存储到 buffer 数组中;
    • 最后使用 va_end() 宏清理 args 变量。
  • 最后结束程序。

9.3 运行结果

在这里插入图片描述

10. vsscanf

10.1 函数说明

函数声明函数功能
int vsscanf(const char *str, const char *format, va_list ap);它使用格式化字符串 format 中的指令来指定输入的格式,并从字符数组 str 中读取数据,并将数据按照指令指定的格式存储到相应的变量中

参数:

  • str: 用来读取的格式化数据的字符数组的指针
  • format : 格式化字符串,用来指定要读取的内容和格式
  • va_list : 一个 va_list 类型的变量,包含了可变参数列表

10.2 演示示例

#include <stdio.h>
#include <stdarg.h>

void myscan(const char *str, const char *format, ...) 
{
    va_list args;
    va_start(args, format);
    vsscanf(str, format, args);
    va_end(args);
}

int main() 
{
    int a;
    float b;
    char s[10];
    char buffer[] = "10 3.1415 huazie";
    
    myscan(buffer, "%d%f%s", &a, &b, s);
    printf("a=%d, b=%.4f, s=%s\n", a, b, s);
    return 0;
}

在上面的示例代码中,

  • 我们首先定义了四个变量 整形 a 、浮点型 b 、 字符数组 s 和 字符数组 buffer
  • 然后,调用自定义的 myscan() 函数从字符数组 buffer 中读取数据,并将数据存储到另外 3 个变量中;
    myscan() 函数中,
    • 我们首先使用 va_start() 宏初始化一个 va_list 变量 args
    • 然后调用 vsscanf() 函数将字符数组 buffer 和格式化字符串以及参数列表传递给该函数进行输入,并将数据存储到相应的变量中;
    • 最后使用 va_end() 宏清理 args 变量。
  • 最后我们打印输出上面从字符数组 buffer 中读取并输入的三个变量的数据,并结束程序。

10.3 运行结果

在这里插入图片描述

参考

  1. [API Reference Document]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/515584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我的创作纪念日(个人感悟)

昨天2023年5月10日是我成为创作者的第128天纪念日&#xff0c;感谢CSDN官方的纪念信让我铭记这特殊的一天。 机缘 要说与CSDN的初次相遇&#xff0c;还是2022年的高考结束完的暑假&#xff0c;当时对于大学的学习没有什么概念&#xff0c;当初的高考志愿报的有计算机相关的专…

spring集成mybatis的原理

spring是怎样和mybatis继承的&#xff1f; 在idea里点mapper.queryOne()直接跳到了接口或xml&#xff0c;它究竟是怎样利用jdbc执行的&#xff1f; 我直接调用mapper.queryOne是怎么使用的sqlsession&#xff1f;怎么去connect的&#xff1f; mybatis是怎样根据mapper找到对应的…

【Java面试】Java并发基础(1)

文章目录 1. 可见性&#xff0c;有序性&#xff0c;原子性2. java中并发和并行3. 通常线程有哪几种使用方式? 1. 可见性&#xff0c;有序性&#xff0c;原子性 可见性&#xff08;Visibility&#xff09;&#xff1a; 指一个线程修改了共享变量的值之后&#xff0c;其他线程能…

学习网络通信必备的DNS解析和Socket通信知识

OkHttp是一个开源的网络请求框架&#xff0c;由Square公司开发。它通过封装Java底层的HttpURLConnection和Okio等库&#xff0c;提供一个简单易用的API&#xff0c;让开发人员能够方便地向服务器发送HTTP/HTTPS请求&#xff0c;支持异步请求和响应回调&#xff0c;并提供丰富的…

未来已来, 新能源与IT的技术碰撞;学习Android车载开发的必然趋势

Android工程师前景 Android车载工程师扮演着关键的角色&#xff0c;他们致力于将最新的Android技术和汽车技术相结合&#xff0c;为汽车行业提供优质的产品。随着越来越多的汽车制造商投资于智能汽车技术和车联网技术&#xff0c;Android车载工程师成为了一个越来越重要的职业…

MATLAB实现二维稳态导热

MATLAB实现二维稳态导热 一、理论基础二、代码实现 一、理论基础 步骤&#xff1a; Step.1 二维模型传热控制微分方程的确定&#xff0c;具体推导可以在任何一本传热学的书中找到。 d 2 T d x 2 d 2 T d y 2 0 \frac{d^{2}T}{dx^{2}}\frac{d^{2}T}{dy^{2}}0 dx2d2T​dy2d2T…

Ansible 自动化运维工具(一)——部署以及命令行模块

文章目录 一、 ansible 的概述1、ansible简介2.、官方网站3、ansible 的特点4、ansible的工作机制5、ansible的组成模块 二、ansible部署1、Asible的安装 三、ansible 命令行模块1、command 模块2、shell 模块3、cron 模块4、user 模块5、group 模块6、copy 模块7、file 模块8、…

【ros/ros2】ros1和ros2的区别-要点记录

dds data distribution service&#xff0c;数据分发服务 rcl ros client libraries&#xff0c;ros客户端库文件 rmw ros middle ware interface&#xff0c;ros中间件接口 lcn life cycle node&#xff0c;生命周期节点&#xff0c;受控节点 lmn lifecycle manageme…

C++二叉树递归方法存入和三种递归方法读出(前序,中序,后序)

#include <stdio.h> #include <malloc.h> typedef struct op //定义子树结构 { int data; struct op *lchild; struct op *rchild; }treestruct; treestruct *createtree() //这里这种表达形式意思是bittree类型的函数 最终要返回bitt…

【Linux】版本管理器Git

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;Linux的学习之路 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录 前言一、Git是什么二、Git有什么…

开源C#代码生成器,专注.NET,Sqlserver,最简单,最干净,支持自编码的开源工具,SmartSoftHelp 开发辅助优化工具

开源C#代码生成器&#xff0c;专注.NET&#xff0c;Sqlserver&#xff0c;最简单&#xff0c;最干净&#xff0c;支持自编码的开源工具&#xff0c;SmartSoftHelp 开发辅助优化工具&#xff01; 下载地址&#xff1a;https://pan.baidu.com/s/1XLL_fLxVTw4erYZLj8-MzA?pwd888…

搭建python运行环境

安装Miniconda3 清华镜像 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/ 下载 安装 next————agree————这俩选哪个都行&#xff0c;他选的第二个————安装路径———— 配置系统环境变量 Path miniconda3所在的路径 D:\Autils\miniconda3 Scri…

ChatGPT 最有可能取代哪些职业?

ChatGPT 的应用场景ChatGPT 最可能取代哪些职业&#xff1f;写在最后 ChatGPT 的应用场景 ChatGPT 的应用场景大体上可以归类为三大模块。 第一类是 代码相关 的任务场景。包含程序语言之间的相互转换&#xff08;如 python 转 java&#xff09;、程序命令的生成、代码 bug 的…

Gateway新一代网关

Gateway功能&#xff1a;路由 过滤 一、概述 官网地址 不使用网关存在的问题&#xff1a; 1、客户端需要记录不同微服务地址&#xff0c;增加客户端的复杂性 2、每个后台微服务都需要认证 3、http 发请求&#xff0c;涉及到跨域 4、后台新增微服务&#xff0c;不能动态知道地…

【持久层框架】mybatis-plus超详细讲解

文章目录 一、简介二、愿景三、特性四、支持数据库五、快速指南步骤1、创建数据库 mybatis_plus2、导入相应的依赖3、连接数据库4、编写代码5、小结 六、配置日志七、常用注解八、CRUD扩展Insert 插入参数说明主键生成策略分布式系统唯一id生成雪花算法主键自增 更新操作参数说…

纪念一下自己做的第一款开发板

文章目录 1. 硬件电路2. 成品展示3. 遇到的问题4. HelloWorld 前言&#xff1a;之前乐鑫搞活动白嫖了10个ESP32-S2模组&#xff0c;想着把它给利用了&#xff0c;然后先从一个开发板做起&#xff0c;等玩明白了再去做一些自己的设计&#xff0c;从网上找了一些资料就开始干&…

【★前后端的交互★】Servlet API

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#xff1a;重难点★✔ 蓝色文字表示&#…

了解一下Spring核心概念——IOC IOC容器 DI Bean

文章目录 1 Spring家族2 Spring发展史3 Spring系统架构3.1 系统架构图3.2 学习路线 4 Spring核心概念4.1 目前项目中的问题4.2 IOC、IOC容器、Bean、DI4.2.1 IOC&#xff08;Inversion of Control&#xff09;控制反转4.2.2 DI&#xff08;Dependency Injection&#xff09;依赖…

(免费分享)springboot,vue物业管理系统

一、项目技术 后端框架&#xff1a;springboot 前端框架&#xff1a;elementUIvue 主要实现了用户登录、社区信息展示、物业公告、社区设施、物业人员信息。 进入物业系统管理后端。实现了社区的管理&#xff0c;包括基本信息管理、周边设施管理、物业公告管理。楼盘管理包括楼…

AI对话-Free Chat免费无限制

目录 前言 使用方法 提问 推荐线路 前言 chat.4 和 chat.5 线路的响应改成通过在 Netlify 的部署来响应了。Netlify 不像 Vercel 那样还限制 Edge Function 的调用次数,很适合部署本项目。现在这两个线路的成本最低了,最优先推荐大家使用。 使用方法 提问 比如我问他:…