C语言从头学66—学习头文件 <stdio.h>(二)

       关于可变参数,我们曾经在《C语言从头学27》中接触过,下面学习能够接收可变参数作为
参数的几个函数。
一、printf函数的能够接收可变参数的变体函数:
 1、函数vprintf()
      功能:按照给定格式,将可变参数中的内容输出到控制台(显示器)
      使用格式:vprintf (参1,参2);
         参1:格式字符串
         参2:可变参数变量(对象)
      返回值:返回值输出的字符数;出错返回负值。
      说明:vprintf()函数可以可以接收va_list对象作为自己的参数,而va_list对象只有在自定义可变参数函数中才能用到,因此vprintf()必须结合自定义可变参数函数才能正常使用;它通过va_list对象对可变函数中的"..."代表的内容进行处理。vprintf()函数不能像printf()那样直接使用。(具体见后边案例)
 2、函数vfprintf()
      功能:按照给定格式,将可变参数中的内容输出到文件
      使用格式:vfprintf(参1,参2,参3);
          参1:文件指针
          参2:格式字符串
          参3:可变参数变量(对象)
      返回值:返回输出的字符数;出错返回负值。
      说明:vfprintf()除了将可变参数内容写入文件不同于上一个函数外,其它方面同1的说明。
 3、函数vsprintf()
      功能:按照给定格式,将可变参数中的内容输出到字符串
      使用格式:vsprintf();
         参1:字符串指针
         参2:格式字符串
         参3:可变参数变量(对象)
     返回值:返回输出的字符数;出错返回负值。
     说明:具体参照1的说明。
二、scanf函数的能够接收可变参数的变体函数:
 1、vscanf()
      功能:按照格式字符串给定格式从键盘读取输入值。
      使用格式:vscanf(参1, 参2);
         参1:格式字符串
         参2:可变参数变量(对象)
      返回值:返回成功读取的项数;遇到文件结尾或发生错误返回-1。
 2、vfscanf()
      功能:按照格式字符串给定格式,从文件读取内容
      使用格式:vfscanf(参1,参2,参3);
         参1:文件指针
         参2:格式字符串
         参3:可变参数变量(对象)
 3、vsscanf()
      功能:按照格式字符串给定格式从字符串读取内容
      使用格式:vsscanf(参1,参2,参3);
         参1:字符串指针
         参2:格式字符串
         参3:可变参数变量(对象)
      说明:a. 这三个函数的使用方法与前面的三个函数很相似,具体可见后边的举例程序;b. 可变参数用于存放读取到的内容,为保证退出函数时值还在参数要用引用方式。
三、举例程序

#include<stdio.h>
#include <stdarg.h>//使用可变参数需用
int myPrintf(char* fmt, ...)
{va_list va; //声明一个可变参数对象va_start(va, fmt); //初始化可变参数对象(通过fmt定位找到“...”)int ret = vprintf(fmt, va); //将va作为参数传入vprintf函数va_end(va); //注销vaprintf("\n");return ret; //ret不为负值表示正常显示
}
int myString(char* mystring,char* fmt, ...)
{va_list va;va_start(va, fmt);int ret = vsprintf(mystring, fmt, va);va_end(va);return ret;
}
int myScanf(char* string, char* fmt, ...)
{va_list va;va_start(va, fmt);int ret = vsscanf(string, fmt, va);va_end(va);return ret;
}
int main(void)
{
//实验函数vprintf()char* fmt = "字符串s:%s包含%d个字符";char* s = "abcdef";int len = strlen(s);int ret=myPrintf(fmt, s, len);//运行结果:字符串s:abcdef包含6个字符//分析:上面的使用场景与使用printf相似,如果把上面三个参数给printf()会得到一样的结果。if (ret >= 0)printf("vprintf()函数调用正常,输出字符%d个\n",ret);//运行结果:vprintf()函数调用正常,输出字符26个
//实验函数vsprintf()char ch[1024] = { 0 };fmt = "%s%s%s";char* s1 = "天津市";char* s2 = "南开区";char* s3 = "位于天津的西南部。";ret = myString(ch, fmt, s1, s2, s3);if (ret >= 0)printf("vsprintf()函数调用正常,写入字符%d个\n", ret);//运行结果:vsprintf()函数调用正常,写入字符30个printf("%s\n", ch);//运行结果:天津市南开区位于天津的西南部。//分析:myString函数将三个字符串连成一个字符串,当然也可以将数字等其他类型连成(转成)字符串。
//实验函数vsscanf()s1 = "abcd1234e"; //读取后字母放一起,数字放一起char a[1024] = { 0 };int b;ret = myScanf(s1, "%c%c%c%c%d%c", &a[0], &a[1], &a[2], &a[3], &b, &a[4]);printf("a=%s\n", a);//运行结果:a = abcdeprintf("b=%d\n", b);//运行结果:b = 1234printf("共读取项数为:%d\n", ret);//运行结果:共读取项数为:6getchar();return 0;
}

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

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

相关文章

Java 用属性名称字符串获取属性对象

一、场景分析 java 中没有 python 一样的方法&#xff0c;通过属性名称直接获取属性值。 getattr(obj, name[, default]) : 访问对象的属性。 getattr(student, name) java 中有 Map, 可以实现类似功能&#xff0c;但是如果我们现在有一个对象&#xff0c;要通过Map的方式获…

九大排序之交换排序

1.前言 所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序的特点是&#xff1a;将键值较大的记录向序列的尾部移动&#xff0c;键值较小的记录向序列的前部移动。 重点&#xff1a; 冒泡排序和快速排序 2.冒泡排…

React Fiber 详解

why Fiber React Fiber的引入主要基于以下几个方面的考虑&#xff1a; 性能提升&#xff1a; 传统React的更新过程是同步的&#xff0c;一旦开始更新就会阻塞浏览器的主线程&#xff0c;直到整个组件树更新完成。这在处理大型组件树或高频用户交互时&#xff0c;可能会导致界…

数组合并与排序练习题

题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数…

OpenCV库模块解析

1.OpenCV库每个模块解析 2.OpenCV的常用函数 它为计算机视觉应用程序提供了一个通用的基础设施&#xff0c;并加速了在商业产品中使用机器感知。作为BSD许可的产品&#xff0c;OpenCV使企业可以很容易地利用和修改代码。该库拥有超过2500个优化算法&#xff0c;其中包括经典和最…

量子概率云:微观世界中的不确定性与概率分布

量子概率云&#xff1a;微观世界中的不确定性与概率分布 摘要&#xff1a; 量子力学的核心之一是概率描述的引入&#xff0c;即粒子的位置和动量不能同时确定&#xff0c;而是在一个概率云中分布。本文探讨了量子概率云的理论基础、数学描述及其在电子云和粒子波函数中的应用。…

【基础介绍】【OCR】

注&#xff1a;若有冒犯&#xff0c;请问候留言&#xff0c;会尽快删除。 文章目录 注&#xff1a;若有冒犯&#xff0c;请问候留言&#xff0c;会尽快删除。背景介绍OCR基本概念介绍基础实现算法深度学习方法1. CNN&#xff08;卷积神经网络&#xff09;2. RNN&#xff08;循环…

C语言学习之 没有重复项数字的全排列

题目描述 给出一组数字&#xff0c;返回该组数字的所有排列 例如&#xff1a; [1,2,3]的所有排列如下 [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1]. &#xff08;以数字在数组中的位置靠前为优先级&#xff0c;按字典序排列输出。&#xff09; 数据范围&#xff1a;数…

【React】入门Day04 —— 项目搭建及登录与表单校验、token 管理、路由鉴权实现

项目搭建 创建项目 # 使用npx创建项目 npx create-react-app my-react-app # 进入项目目录 cd my-react-app # 创建项目目录结构 mkdir -p src/{apis,assets,components,pages,store,utils} touch src/{App.js,index.css,index.js} 使用npx create-react-app创建项目&#xff0…

网站优化门槛低了还是高了?

自从2015年刚接触网站时&#xff0c;从一无所知到现在无人指导&#xff0c;一直跌跌撞撞走过来&#xff0c;当年花了1500元找了广东一个网友用织梦CMS做了一个门户网站&#xff0c;记得那时一星期没下楼&#xff0c;把网站折腾的千疮百孔&#xff0c;而终逐步熟悉网站建设与搜索…

【在Linux世界中追寻伟大的One Piece】DNS与ICMP

目录 1 -> DNS(Domain Name System) 1.1 -> DNS背景 2 -> 域名简介 2.1 -> 域名解析过程 3 -> 使用dig工具分析DNS 4 -> ICMP协议 4.1 -> ICMP功能 4.2 -> ICMP报文格式 4.3 -> Ping命令 4.4 -> traceroute命令 1 -> DNS(Domain Na…

webGL进阶(一)多重纹理效果

效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…

Matter蓝牙解析

解析 Matter 蓝牙广播 定义需要解析的字段。 #import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN/// 蓝牙广播服务 ID extern NSString * const MatterBLEAdvServiceID;@interface MatterBLEAdv : NSObject @property (nonatomic, assign) NSInteger opCode; @…

【Unity踩坑】Unity导出的UWP项目编译失败

在Unity中导出了UWP平台的项目后&#xff08;Xaml或D3D&#xff09;&#xff0c;使用Visual Studio编译时发生错误&#xff1a; Error: Unity.IL2CPP.Building.BuilderFailedException: Lump_libil2cpp_vm.cpp 查找后发现是Visual Studio 与Unity兼容的问题 原贴&#xff1a;…

黑神话:仙童,数据库自动反射魔法棒

黑神话&#xff1a;仙童&#xff0c;数据库自动反射魔法棒 Golang 通用代码生成器仙童发布了最新版本电音仙女尝鲜版十一及其介绍视频&#xff0c;视频请见&#xff1a;https://www.bilibili.com/video/BV1ET4wecEBk/ 此视频介绍了使用最新版的仙童代码生成器&#xff0c;将 …

使用YOLOv11进行视频目标检测

使用YOLOv11进行视频目标检测 完整代码 import cv2 from ultralytics import YOLOdef predict(chosen_model, img, classes[], conf0.5):if classes:results chosen_model.predict(img, classesclasses, confconf)else:results chosen_model.predict(img, confconf)return r…

view deign 和 vue2 合并单元格的方法

1.vue版本和view design 版本 {"vue": "^2.6.11","view-design": "^4.7.0", }2.Data中定义数据 spanArr: [], // 某一列下需要合并的行数 pos: 0// 索引// 注意点&#xff1a; 在获取列表前&#xff0c;需要重置 this.spanArr [] 注…

C++-容器适配器- stack、queue、priority_queue和仿函数

目录 1.什么是适配器 2.deque 1.简单了解结构 2.deque的缺陷 3.为什么选择deque作为stack和queue的底层默认容器 3.stack&#xff08;栈&#xff09; 4.queue&#xff08;队列&#xff09; 5.仿函数 6.priority_queue&#xff08;优先级队列&#xff09;&#xff08;堆…

切片辅助超推理-sahi库-get_sliced_prediction源码简析

代码地址&#xff1a;https://github.com/obss/sahi get_sliced_prediction源码中重要是理解nms或nmm。nms经常遇到不说。 其中nmm即Non-Max Merging算法是最重要部分&#xff0c;它其实和nms比较类似。其具体原理我看到了一片博客&#xff0c;感觉讲的很好&#xff0c;如下&a…

Linux C接口编程入门之文件I/O

一切皆文件 "Linux一切皆文件"是Linux操作系统中的一个重要理念和设计原则。在Linux系统中&#xff0c;几乎所有的设备、资源都以文件的形式进行访问和操作。简化了操作系统的设计和管理&#xff0c;提供了一种统一的抽象模型&#xff0c;使得应用程序可以使用相同的…