C程序设计语言- 输入与输出-6.1----标准输入与输出、格式化输出(printf)、变长参数表、格式化输入(scanf)、文件访问
来源:互联网 发布:js 数组 splice 删除 编辑:程序博客网 时间:2024/06/07 01:15
前言:继续C系列基础。C系列也快进入尾声了,估计还有俩篇博客。
1.标准输入与输出
2..变长参数表
每一个程序员写的第一个程序大概鼎鼎大名的hello world了,一个简简单单,就那么几行的小程序开启了另一个世界的大门,从此,我们发现了更广阔的世界。而每一个C程序员接触到的第一个函数(除去main函数不算)大概就是printf函数了。这个函数用法很简单灵活,然而里面暗藏玄机,包含了C语言诸多的内容。
不知道大家发现没有,printf函数的参数个数是可变的。下面这三个函数都可以完美运行。
- 1
- 2
- 3
- 1
- 2
- 3
上面这三个函数分别有一个、两个、三个参数。而我们学的C语言函数参数的个数都是固定的,比如下面这个swap()函数,必须传入两个int型指针才能运行。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
而且C语言里面没有类似C++当中类似默认构造函数的机制,那么printf函数参数个数可变是怎么实现的呢?
printf()函数的声明形式是这样:
- 1
- 1
第一个参数是char型指针,第二个参数是”…”???正是这个“…”实现了printf的变长参数表。
标准头文件stddrg.h当中包含了一组宏定义,它们对如何遍历参数表进行了定义。
va_list 类型用于声明一个变量,该变量将依次引用各参数。我们将该变量称为ap,意思是“参数指针”。宏va_start将ap初始化为指向第一个无名参数的指针。在使用ap 之前,该宏必须被调用一次。参数表必须至少包括一个有名参数,va_start将最后一个有名参数作为起点。
每次调用va_arg,该函数都将返回一个参数,并将ap 指向下一个参数。va_arg 使用一个类型名来决定返回的对象类型、指针移动的步长。最后,必须在函数返回之前调用va_end,以完成一些必要的清理工作。
下面使用变长参数表实现printf的两个简单功能,打印整数和字符串。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 1
- 2
- 3
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
程序执行效果:
3.文件访问
#include <stdio.h>/* cat: concatenate files, version 1 */main(int argc, char *argv[]){FILE *fp;void filecopy(FILE *, FILE *)if (argc == 1) /* no args; copy standard input */filecopy(stdin, stdout);elsewhile(--argc > 0)if ((fp = fopen(*++argv, "r")) == NULL) {printf("cat: can't open %s\n, *argv);return 1;} else {filecopy(fp, stdout);fclose(fp);}return 0;}/* filecopy: copy file ifp to file ofp */void filecopy(FILE *ifp, FILE *ofp){int c;while ((c = getc(ifp)) != EOF)putc(c, ofp);}
- C程序设计语言- 输入与输出-6.1----标准输入与输出、格式化输出(printf)、变长参数表、格式化输入(scanf)、文件访问
- 格式化输入与输出
- 格式化输入与输出
- 格式化输入与输出
- 格式化输入与输出
- 格式化输入(scanf)输出(printf)函数
- 格式化的输入scanf输出printf
- C程序设计语言(五)输入与输出
- C语言--格式化输入/输出函数(printf/scanf,fprintf/fscanf,sprintf,sscanf)
- C格式化输入/输出
- C格式化输入、输出
- C 语言之格式化输入与输出
- C语言格式化输出与输入
- C-printf的格式化输入/输出
- C程序设计语言整理笔记(七)输入与输出
- C程序设计语言--格式化输入/输出 sprintf fprintf sscanf snprintf
- C语言格式化输入/输出
- 【回味C】格式化输入/输出
- 清空串口的缓存及应用
- 嵌入式平台-Pptpd移植
- vim 格式化代码
- java、Android 字符串、json写入文件
- 一个android的dialog框架
- C程序设计语言- 输入与输出-6.1----标准输入与输出、格式化输出(printf)、变长参数表、格式化输入(scanf)、文件访问
- deque
- Mysql数据库调优 简单总结
- 正则表达式语法实例详解
- PDO预处理查询,插入
- linux数据库初始化配置
- 网站架构:负载均衡
- redis_fdw使用简介
- 笔记本选购简述