C語言中可變参數的用法——va_list、va_start、va_arg、va_end参數定義

Slides:



Advertisements
Similar presentations
C语言程序设计 主讲教师 :张群燕 电话:
Advertisements

第4章 條件判斷與迴圈 Java 2 程式設計入門與應用.
C#程序设计案例教程 第3章 程 序 结 构.
第一章 C语言概述 计算机公共教学部.
第九章 字串 (String).
项目五——校园一卡通程序功能模块化设计 5-1项目显示查询和退出函数设计.
编译原理上机实习
第三章 控制结构.
程式設計實作.
第一章 程序设计入门.
主讲教师:吴琼 微信群:C语言2016 QQ群: 密码scu2016 昵称:“真名+学号”
循环结构又称为重复结构:用来处理需要重复处理的问题,它是程序中一种很重要的结构。
Visual C++ introduction
函數 授課:ANT 日期:2009/3/24.
函數 授課:ANT 日期:2011/3/28.
Chap 10 函数与程序结构 10.1 函数的组织 10.2 递归函数 10.3 宏定义 10.4 编译预处理.
C程序设计.
If … else 選擇結構 P27.
C 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:
程序讲解 第一题: 将指定文件的m行到n行字符写到显示屏上,m和n值从键盘输入。 运行时输入及结果: please enter m,n:
C++ 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
STRUCTURE 授課:ANT 日期:2010/5/12.
第七章 函数 目录 有参的加法函数的开发 函数定义的一般形式 函数参数和函数的值 函数的调用
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Function.
程序设计期末复习 黎金宁
程式撰寫流程.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
Introduction to the C Programming Language
1. 說明一個一維整數陣列passwd,下標範圍0至49 2. 在屏幕顯示 "Enter password"
C语言 程序设计基础与试验 刘新国、2012年秋.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
本章中將會更詳細地考慮有關重複的概念,並且會 介紹for和do…while等兩種用來控制重複的敘述 式。 也將會介紹switch多重選擇敘述式。 我們會討論直接和迅速離開某種控制敘述式的 break敘述式,以及用來跳過重複敘述式本體剩餘 部份的continue敘述式。 本章會討論用來組合控制條件的邏輯運算子,最後.
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
計數式重複敘述 for 迴圈 P
第5讲 结构化程序设计(Part II) 周水庚 2018年10月11日.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
C语言概述 第一章.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
第 二 章 数据类型、运算符与表达式.
for 迴圈 while迴圈 do-while迴圈 break 與 continue goto 與 標籤 程式觀摩
C 语言程序设计 程序的循环结构 电大崇信县工作站 梁海亮.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
Chap 5 函数 5.1 计算圆柱体积 5.2 使用函数编写程序 5.3 变量与函数.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第十四章 若干深入问题和C独有的特性 作业: 函数指针 函数作参数 函数副作用 运算 语句 位段 存储类别 编译预处理
C程序设计.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
第7章 程序的结构 四、生存期与存储属性 五、extern关键字与外部连接属性 六、static关键字与内部连接属性.
第二章 类型、对象、运算符和表达式.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
第五章 逻辑运算和判断选取控制 §5.1 关系运算符和关系表达式
Introduction to the C Programming Language
第七章  数 组.
Arguments to the main Function and Final Project
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
多重條件選擇敘述
基本資料型態 變數與常數 運算子 基本的資料處理 授課:ANT 日期:2014/03/03.
Advanced Competitive Programming
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
Chap 10 函数与程序结构 10.1 圆形体积计算器 10.2 汉诺塔问题 10.3 长度单位转换 10.4 大程序构成.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Q1(a) 小偉打算編寫一個程序。該程序把兩個44的表內的數字相加。表3內的數字是由表1和表2應格子內的數字相加而成。例如:
Advanced Competitive Programming
Presentation transcript:

C語言中可變参數的用法——va_list、va_start、va_arg、va_end参數定義 2018/7/22 C語言中可變参數的用法——va_list、va_start、va_arg、va_end参數定義 Date: 2016/11/15 Department of Computer Science and Information Engineering National Cheng Kung University, Taiwan R.O.C. CSIE CIAL Lab 1

C語言可變参數簡介 我們在C語言編程中會遇到一些参數個數可變的函數,例如printf()這個函數,它的定義是這样的:       int printf( const char* format, ...);   它除了有一個参數format固定以外,後面跟的参數的個數和類型是可變的,例如我們可以有以下不同的調用方法:        printf("%d",i);        printf("%s",s);        printf("the number is %d ,string is:%s", i, s); National Cheng Kung University CSIE Computer & Internet Architecture Lab

寫一個簡單的可變参數的C函數  void va_start( va_list arg_ptr, prev_param );  type va_arg( va_list arg_ptr, type );  void va_end( va_list arg_ptr ); va在這裏是variable-argument(可變参數)的意思.這些macro定義在stdarg.h中,所以用到可變参數的程序應該包含這個頭文件.下面我們寫一個簡單的可變参數的函數,改函數至少有一個整數参數,第二個参數也是整數,是可選的.函數只是打印這兩個参數的值. National Cheng Kung University CSIE Computer & Internet Architecture Lab

簡單CODE void simple_va_fun(int i, ...) { va_list arg_ptr; int j=0;     va_start(arg_ptr, i);      j=va_arg(arg_ptr, int);      va_end(arg_ptr);      printf("%d %d\n", i, j);      return;    } National Cheng Kung University CSIE Computer & Internet Architecture Lab

我們可以在上述的文件中這樣宣告我們的函數: 我們可以在上述的文件中這樣宣告我們的函數:      extern void simple_va_fun(int i, ...);     我們在程序中可以這样調用:      simple_va_fun(100);        simple_va_fun(100,200); National Cheng Kung University CSIE Computer & Internet Architecture Lab

範例 :CODE #include "stdio.h" #include "stdarg.h" void minprintf(char *fmt, ...); void errmsg(int code, ...); int errorf(const char *format, ...); int sum(int num, ...); int sum1(int num, ...); double double_sum(double num, ...); int FILENAME=1, LINENUMBER=2, WARN=4; National Cheng Kung University CSIE Computer & Internet Architecture Lab

main(int argc, char *argv[]) { char *s = "HELLO"; int x = 10; double f = 10.0; fprintf(stdout, "\n===== Test errmsg() =====\n"); errmsg(1, "<FILE>", "cannot open %s\n", "a_file"); errmsg(3,"<FILE>",7,"cannot open %s\n","a_file"); errmsg(2, 7, "cannot open %s\n", "a_file"); errmsg(4, "<FILE> %s, x=%d", "a_file", 10); printf("\n"); fprintf(stdout, "\n===== Test minprintf() =====\n"); minprintf("x = %d, f = %f, s = %s\n", x, f, s); minprintf("s = %s, x = %d, f = %f, s = %s\n", s, x, f, s); minprintf("s = %s, x = %d, f = %f, s = %x\n", s, x, f, s); fprintf(stdout, "\n===== Test errorf() =====\n"); errorf("x = %d, f = %f, s = %s\n", x, f, s); fprintf(stdout, "\n===== Test sum, sum1, double_sum() =====\n"); printf("sum(4, 1, 2, 3, 4) = %d\n", sum(4, 1, 2, 3, 4)); printf("sum1(4, 1, 2, 3, 4, 0) = %d\n", sum1(4, 1, 2, 3, 4, 0)); printf("double_sum(4.0, 1.0, 2.0, 3.4, 0.0) = %f\n", double_sum(4.0, 1.0, 2.0, 3.4, 0.0)); } National Cheng Kung University CSIE Computer & Internet Architecture Lab

int errorf(const char *format, ...) { static int num_errors = 0; int n; va_list ap; num_errors++; fprintf(stderr, "** Error %d: ", num_errors); va_start(ap, format); n = vfprintf(stderr, format, ap); va_end(ap); fprintf(stderr, "\n"); return n; } National Cheng Kung University CSIE Computer & Internet Architecture Lab

void errmsg(int code, ...) { va_list ap; char *fmt; va_start(ap, code); //int FILENAME=1, LINENUMBER=2, WARN=4; if (code&FILENAME) (void)fprintf(stderr, "\"%s\":", va_arg(ap, char *)); if (code&LINENUMBER) (void)fprintf(stderr, "%d:", va_arg(ap, int)); if (code&WARN) (void)fputs("Warning:", stderr); fmt = va_arg(ap, char *); (void) vfprintf(stderr, fmt, ap); va_end(ap); } National Cheng Kung University CSIE Computer & Internet Architecture Lab

int sum(int num, ...) { va_list ap; int i, n = 0; va_start(ap, num); for (i=0; i<num; i++) n += va_arg(ap, int); return n; } int sum1(int num, ...) { int i=0, t, n = 0; n = num; while (1) { t = va_arg(ap, int); if (t<=0) break; n += t; //if (i<0)printf("%d,%d\n", ++i, t); National Cheng Kung University CSIE Computer & Internet Architecture Lab

double double_sum(double num, ...) { va_list ap; int cnt=0; double t, f = 0.0; va_start(ap, num); f = num; // printf("f=%f\n", f); if(num==0.0) return 0.0; cnt=1; while (1) { t = va_arg(ap, double); if (t==0.0) break; cnt++; f += t; } return f; National Cheng Kung University CSIE Computer & Internet Architecture Lab

void minprintf(char. fmt,. ) { va_list ap; char. p, void minprintf(char *fmt, ...) { va_list ap; char *p, *sval; int ival; double dval; va_start(ap, fmt); for(p=fmt; *p; p++){ if (*p != '%'){ putchar(*p); continue; } switch (*++p){ case 'd': ival = va_arg(ap, int); printf("%d", ival); break; case 'f': dval = va_arg(ap, double); printf("%f", dval); break; case 's': for (sval=va_arg(ap, char *); *sval; sval++) putchar(*sval); break; default: printf("'undefined'"); break; va_end(ap); National Cheng Kung University CSIE Computer & Internet Architecture Lab

Source http://fanli7.net/a/bianchengyuyan/C__/20130113/289956.html National Cheng Kung University CSIE Computer & Internet Architecture Lab