va_list是什么?变量?结构?在哪个头文件定义的?

va_list是什么?变量?结构?在哪个头文件定义的?,第1张

头文件为#include 〈stdarg.h〉,是在C语言中解决变参问题的一组宏。

函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。

有些库中va_list实现为char* 指针,可变参数的函数游余耐原理神春其实很简单,而VA系列是以宏定义来定义的,实现跟堆毁灶栈相关。

可变参数即表示参数个数可以变化,可多可少,也表棚世示参数的类型也可以变化,可以是int,double还可以是char*,类,结构体等等。可变参数是实现printf(),sprintf()等函数的关键之处,也可以用可变参数来对任意数量的数据进行求和,求平均值带来方便(不然就用数组或每种写个重载)。在C#中有专门的关键字parame,但在C,C++并没有类似的语法,不过幸好提供这方面的处理函数,本文将重点介绍如何使用链山肢这些函数。

第一步 可变参数表示

用三个点…来表示,查看printf()函数和scanf()函数的声明:

int printf(const char *, ...)

int scanf(const char *, ...)

这三个点用在宏中就是变参宏(Variadic Macros),默认名称为__VA_ARGS__。如:唯明

#define WriteLine(...) { printf(__VA_ARGS__)putchar('\n')}

再WriteLine("MoreWindows")

考虑下printf()的返回值是表示输出的字节数。将上面宏改成:

#define WriteLine (...) printf(__VA_ARGS__) + (putchar('\n') != EOF ? 1: 0)

这样就可以得到WriteLine宏的返回值了,它将返回输出的字节数,包括最后的’\n’。如下例所示i和j都将输出12。

int i = WriteLine("MoreWindows")

WriteLine("%d", i)

int j = printf("%s\n", "MoreWindows")

WriteLine("%d", j)

第二步 如何处理va_list类型

函数内部对可变参数都用va_list及与它相关的三个宏来处理,这是实现变参参数的关键之处。

在<stdarg.h>中可以找到va_list的定义:

typedef char * va_list

再介绍与它关系密切的三个宏要介绍下:va_start(),va_end()和va_arg()。

同样在<stdarg.h>中可以找到这三个宏的定义:

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

#define va_end(ap) ( ap = (va_list)0 )

#define va_arg(ap,t)( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

其中用到的_INTSIZEOF宏定义如下:

#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) &~(sizeof(int) - 1) )

来分析这四个宏:

va_end(ap)这个最简单,就是将指针置成NULL。

va_start(ap,v)中ap = (va_list)&v + _INTSIZEOF(v)先是取v的地址,再加上_INTSIZEOF(v)。_INTSIZEOF(v)就有点小复杂了。( (sizeof(n) + sizeof(int) - 1) &~(sizeof(int) - 1) )全是位 *** 作,看起来有点麻烦,其实不然,非常简单的,就是取整到sizeof(int)。比如sizeof(int)为4,1,2,3,4就取4,5,6,7,8就取8。对x向n取整用C语言的算术表达就是((x+n-1)/n)*n,当n为2的幂时可以将最后二步运算换成位 *** 作——将最低 n - 1个二进制位清 0就可以了。

va_arg(ap,t)就是从ap中取出类型为t的数据,并将指针相应后移。如va_arg(ap, int)就表示取出一个int数据并将指针向移四个字节。

因此在函数中先用va_start()得到变参的起始地址,再用va_arg()一个一个取值,最后再用va_end()收尾就可以解析可变参数了。

第三步 vfprintf()函数和vsprintf()函数

vfprintf()这个函数很重要,光从名字上看就知道它与经常使用的printf()函数有很大的关联。它有多个重载版本,这里讲解最常用的一种:

函数原型

int vfprintf(

FILE *stream,

const char *format,

va_list argptr

)

第一个参数为一个FILE指针。FILE结构在C语言的读写文件必不可少。要对屏幕输出传入stdout。

第二个参数指定输出的格式。

第三个参数是va_list类型,这个少见,但其实就是一个char*表示可变参参数的起始地址。

返回值:成功返回输出的字节数(不包括最后的’\0’),失败返回-1。

vsprintf()与上面函数类似,就只列出函数原型了:

int vsprintf(

char *buffer,

const char *format,

va_list argptr

)

还有一个int _vscprintf(const char *format, va_list argptr )可以用来计算vsprintf()函数中的buffer字符串要多少字节的空间。

代码范例

下面就给出了自己实现的printf()函数(注1)与WriteLine()函数

int Printf(char *pszFormat, ...)

{

va_list pArgList

va_start(pArgList, pszFormat)

int nByteWrite = vfprintf(stdout, pszFormat, pArgList)

va_end(pArgList)

return nByteWrite

}

int WriteLine(char *pszFormat, ...)

{

va_list pArgList

va_start(pArgList, pszFormat)

int nByteWrite = vfprintf(stdout, pszFormat, pArgList)

if (nByteWrite != -1)

putchar('\n')//注2

va_end(pArgList)

return (nByteWrite == -1 ? -1 : nByteWrite + 1)

}

调用与printf()函数相同。

再给出一个用可变参数来求和,遗憾的在C,C++中无法确定传入的可变参数的个数(printf()中是通过扫描'%'个数来确实参数的个数的),因此要么就要指定个数,要么在参数的最后要设置哨兵数值:

设置哨兵数值:

const int GUARDNUMBER = 0//哨兵标识

//变参参数的个数无法确定,在printf()中是通过扫描'%'个数,在这通过设置哨兵标识来确定变参参数的终止

int MySum(int i, ...)

{

int sum = i

va_list argptr

va_start(argptr, i)

while ((i = va_arg(argptr, int)) != GUARDNUMBER)

sum += i

va_end(argptr)

return sum

}

可以这样的调用: printf("%d\n", MySum(1, 3, 5, 7, 9, 0))

但不可以直接传入一个0: printf("%d\n", MySum(0))//error

指定个数:

int MySum(int nCount, ...)

{

if (nCount <= 0)

return 0

int sum = 0

va_list argptr

va_start(argptr, nCount)

for (int i = 0i <nCounti++)

sum += va_arg(argptr, int)

va_end(argptr)

return sum

}

调用时第一个参数表示后面参数的个数如:

printf("%d\n", MySum(5, 1, 3, 5, 7, 9))

printf("%d\n", MySum(0))

代码所用的头文件:

#include <stdarg.h>

#include <stdio.h>

可变参数的使用方法远远不止上述几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃。

assert.h> //设定插入点

#include <ctype.h>//字符处理

#include <errno.h>//定义错误码

#include <float.h>//浮点数处理

#include <fstream.h> //卜罩文件输入/输出

#include <iomanip.h> //参数化输入/输出

#include <iostream.h> //数据流输入/输出

#include <limits.h> //定义各种数据类型最值常量

#include <locale.h> //定义本地化函数

#include <math.h>//定义数学函数

#include <stdio.h>//定义输入/输出函数

#include <stdlib.h> //定义杂项函数及内存分配函数

#include <string.h> //字符串处理

#include <strstrea.h> //基于数组的输入/输出

#include <time.h>//定义关于时间的函数

#include <wchar.h>//宽字符处理及输入/输出

#include <wctype.h> //宽字符分类

//////////////////////////////////////////////////////////////////////////

标准 C++ (同上的不再注释)

#include <algorithm> //STL 通用算法

#include <bitset>//STL 位集容器

#include <cctype>

#include <cerrno>

#include <clocale>

#include <cmath>

#include <complex>//复数类

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <ctime>

#include <deque> //STL 双端队列容器

#include <exception> //异常处理类

#include <fstream>

#include <functional> //STL 定义运算函数(代替运算符)

#include <limits>

#include <list> //STL 线性列表容器

#include <map> //STL 映射容器

#include <iomanip>

#include <ios> //基本输入/输出支持

#include <iosfwd>//输入/输出系统使用的前置声明

#include <iostream>

#include <istream>//基本输入流

#include <ostream>//基本输出流

#include <queue> //STL 队列容器

#include <set> //STL 集合容器

#include <sstream>//基于字符串的流

#include <stack> //STL 堆栈容器

#include <stdexcept> //标准异常类

#include <streambuf> //底层输入/输出支持

#include <string>//字符串类

#include <utility>//STL 通用模板类

#include <vector>//STL 动态数组容器

#include <cwchar>

#include <cwctype>

using namespace std

//////////////////////////////////////////////////////////////////////////

C99 增加

#include <complex.h> //复数型猛闹处理

#include <fenv.h> //浮点环境

#include <inttypes.h> //整数格式转换

#include <stdbool.h> //布尔环境

#include <stdint.h> //整型环境

#include <tgmath.h> //通用类型数学宏

C头文件大全

分类函数,所在函数库为ctype.h

int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0

int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或知拦数字('0'-'9')

返回非0值,否则返回0

int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0

int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)

返回非0值,否则返回0

int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0

int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否则返回0

int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0

int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否则返回0

int ispunct(int ch) 若ch是标点字符(0x00-0x1F)返回非0值,否则返回0

int isspace(int ch) 若ch是空格(' '),水平制表符('\t'),回车符('\r'),

走纸换行('\f'),垂直制表符('\v'),换行符('\n')

返回非0值,否则返回0

int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0

int isxdigit(int ch) 若ch是16进制数('0'-'9','A'-'F','a'-'f')返回非0值,

否则返回0

int tolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z')

int toupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z')

数学函数,所在函数库为math.h、stdlib.h、string.h、float.h

int abs(int i)返回整型参数i的绝对值

double cabs(struct complex znum) 返回复数znum的绝对值

double fabs(double x) 返回双精度参数x的绝对值

longlabs(long n) 返回长整型参数n的绝对值

double exp(double x) 返回指数函数ex的值

double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中

double ldexp(double value,int exp) 返回value*2exp的值

double log(double x) 返回logex的值

double log10(double x) 返回log10x的值

double pow(double x,double y)返回xy的值

double pow10(int p)返回10p的值

double sqrt(double x) 返回+√x的值

double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度

double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度

double atan(double x) 返回x的反正切tan-1(x)值,x为弧度

double atan2(double y,double x)返回y/x的反正切tan-1(x)值,y的x为弧度

double cos(double x) 返回x的余弦cos(x)值,x为弧度

double sin(double x) 返回x的正弦sin(x)值,x为弧度

double tan(double x) 返回x的正切tan(x)值,x为弧度

double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度

double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度

double tanh(double x) 返回x的双曲正切tanh(x)值,x为弧度

double hypot(double x,double y)返回直角三角形斜边的长度(z),

x和y为直角边的长度,z2=x2+y2

double ceil(double x) 返回不小于x的最小整数

double floor(double x) 返回不大于x的最大整数

void srand(unsigned seed)初始化随机数发生器

int rand() 产生一个随机数并返回这个数

double poly(double x,int n,double c[])从参数产生一个多项式

double modf(double value,double *iptr)将双精度数value分解成尾数和阶

double fmod(double x,double y)返回x/y的余数

double frexp(double value,int *eptr) 将双精度数value分成尾数和阶

double atof(char *nptr) 将字符串nptr转换成浮点数并返回这个浮点数

double atoi(char *nptr) 将字符串nptr转换成整数并返回这个整数

double atol(char *nptr) 将字符串nptr转换成长整数并返回这个整数

char *ecvt(double value,int ndigit,int *decpt,int *sign)

将浮点数value转换成字符串并返回该字符串

char *fcvt(double value,int ndigit,int *decpt,int *sign)

将浮点数value转换成字符串并返回该字符串

char *gcvt(double value,int ndigit,char *buf)

将数value转换成字符串并存于buf中,并返回buf的指针

char *ultoa(unsigned long value,char *string,int radix)

将无符号整型数value转换成字符串并返回该字符串,radix为转换时所用基数

char *ltoa(long value,char *string,int radix)

将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数

char *itoa(int value,char *string,int radix)

将整数value转换成字符串存入string,radix为转换时所用基数

double atof(char *nptr) 将字符串nptr转换成双精度数,并返回这个数,错误返回0

intatoi(char *nptr) 将字符串nptr转换成整型数, 并返回这个数,错误返回0

long atol(char *nptr) 将字符串nptr转换成长整型数,并返回这个数,错误返回0

double strtod(char *str,char **endptr)将字符串str转换成双精度数,并返回这个数,

long strtol(char *str,char **endptr,int base)将字符串str转换成长整型数,

并返回这个数,

int matherr(struct exception *e)

用户修改数学错误返回信息函数(没有必要使用)

double _matherr(_mexcep why,char *fun,double *arg1p,

double *arg2p,double retval)

用户修改数学错误返回信息函数(没有必要使用)

unsigned int _clear87() 清除浮点状态字并返回原来的浮点状态

void _fpreset() 重新初使化浮点数学程序包

unsigned int _status87() 返回浮点状态字

目录函数,所在函数库为dir.h、dos.h

int chdir(char *path) 使指定的目录path(如:"C:\\WPS")变成当前的工作目录,成

功返回0

int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的文件,成功

返回0

pathname为指定的目录名和文件名,如"C:\\WPS\\TXT"

ffblk为指定的保存文件信息的一个结构,定义如下:

┏━━━━━━━━━━━━━━━━━━┓

┃struct ffblk┃

┃{ ┃

┃ char ff_reserved[21]/*DOS保留字*/┃

┃ char ff_attrib /*文件属性*/ ┃

┃ int ff_ftime /*文件时间*/ ┃

┃ int ff_fdate /*文件日期*/ ┃

┃ long ff_fsize /*文件长度*/ ┃

┃ char ff_name[13]/*文件名*/ ┃

┃} ┃

┗━━━━━━━━━━━━━━━━━━┛

attrib为文件属性,由以下字符代表

┏━━━━━━━━━┳━━━━━━━━┓

┃FA_RDONLY 只读文件┃FA_LABEL 卷标号┃

┃FA_HIDDEN 隐藏文件┃FA_DIREC 目录 ┃

┃FA_SYSTEM 系统文件┃FA_ARCH 档案 ┃

┗━━━━━━━━━┻━━━━━━━━┛

例:

struct ffblk ff

findfirst("*.wps",&ff,FA_RDONLY)

int findnext(struct ffblk *ffblk) 取匹配finddirst的文件,成功返回0

void fumerge(char *path,char *drive,char *dir,char *name,char *ext)

此函数通过盘符drive(C:、A:等),路径dir(\TC、\BC\LIB等),

文件名name(TC、WPS等),扩展名ext(.EXE、.COM等)组成一个文件名

存与path中.

int fnsplit(char *path,char *drive,char *dir,char *name,char *ext)

此函数将文件名path分解成盘符drive(C:、A:等),路径dir(\TC、\BC\LIB等),

文件名name(TC、WPS等),扩展名ext(.EXE、.COM等),并分别存入相应的变量中.

int getcurdir(int drive,char *direc) 此函数返回指定驱动器的当前工作目录名称

drive 指定的驱动器(0=当前,1=A,2=B,3=C等)

direc 保存指定驱动器当前工作路径的变量 成功返回0

char *getcwd(char *buf,iint n) 此函数取当前工作目录并存入buf中,直到n个字

节长为为止.错误返回NULL

int getdisk() 取当前正在使用的驱动器,返回一个整数(0=A,1=B,2=C等)

int setdisk(int drive) 设置要使用的驱动器drive(0=A,1=B,2=C等),

返回可使用驱动器总数

int mkdir(char *pathname) 建立一个新的目录pathname,成功返回0

int rmdir(char *pathname) 删除一个目录pathname,成功返回0

char *mktemp(char *template) 构造一个当前目录上没有的文件名并存于template中

char *searchpath(char *pathname) 利用MSDOS找出文件filename所在路径,

,此函数使用DOS的PATH变量,未找到文件返回NULL

进程函数,所在函数库为stdlib.h、process.h

void abort() 此函数通过调用具有出口代码3的_exit写一个终止信息于stderr,

并异常终止程序。无返回值

int exec…装入和运行其它程序

int execl( char *pathname,char *arg0,char *arg1,…,char *argn,NULL)

int execle( char *pathname,char *arg0,char *arg1,…,

char *argn,NULL,char *envp[])

int execlp( char *pathname,char *arg0,char *arg1,…,NULL)

int execlpe(char *pathname,char *arg0,char *arg1,…,NULL,char *envp[])

int execv( char *pathname,char *argv[])

int execve( char *pathname,char *argv[],char *envp[])

int execvp( char *pathname,char *argv[])

int execvpe(char *pathname,char *argv[],char *envp[])

exec函数族装入并运行程序pathname,并将参数

arg0(arg1,arg2,argv[],envp[])传递给子程序,出错返回-1

在exec函数族中,后缀l、v、p、e添加到exec后,

所指定的函数将具有某种 *** 作能力

有后缀 p时,函数可以利用DOS的PATH变量查找子程序文件。

l时,函数中被传递的参数个数固定。

v时,函数中被传递的参数个数不固定。

e时,函数传递指定参数envp,允许改变子进程的环境,

无后缀e时,子进程使用当前程序的环境。

void _exit(int status)终止当前程序,但不清理现场

void exit(int status) 终止当前程序,关闭所有文件,写缓冲区的输出(等待输出),

并调用任何寄存器的"出口函数",无返回值

int spawn…运行子程序

int spawnl( int mode,char *pathname,char *arg0,char *arg1,…,

char *argn,NULL)

int spawnle( int mode,char *pathname,char *arg0,char *arg1,…,

char *argn,NULL,char *envp[])

int spawnlp( int mode,char *pathname,char *arg0,char *arg1,…,

char *argn,NULL)

int spawnlpe(int mode,char *pathname,char *arg0,char *arg1,…,

char *argn,NULL,char *envp[])

int spawnv( int mode,char *pathname,char *argv[])

int spawnve( int mode,char *pathname,char *argv[],char *envp[])

int spawnvp( int mode,char *pathname,char *argv[])

int spawnvpe(int mode,char *pathname,char *argv[],char *envp[])

spawn函数族在mode模式下运行子程序pathname,并将参数

arg0(arg1,arg2,argv[],envp[])传递给子程序.出错返回-1

mode为运行模式

mode为 P_WAIT 表示在子程序运行完后返回本程序

P_NOWAIT 表示在子程序运行时同时运行本程序(不可用)

P_OVERLAY表示在本程序退出后运行子程序

在spawn函数族中,后缀l、v、p、e添加到spawn后,

所指定的函数将具有某种 *** 作能力

有后缀 p时, 函数利用DOS的PATH查找子程序文件

l时, 函数传递的参数个数固定.

v时, 函数传递的参数个数不固定.

e时, 指定参数envp可以传递给子程序,允许改变子程序运行环境.

当无后缀e时,子程序使用本程序的环境.

int system(char *command) 将MSDOS命令command传递给DOS执行

转换子程序,函数库为math.h、stdlib.h、ctype.h、float.h

char *ecvt(double value,int ndigit,int *decpt,int *sign)

将浮点数value转换成字符串并返回该字符串

char *fcvt(double value,int ndigit,int *decpt,int *sign)

将浮点数value转换成字符串并返回该字符串

char *gcvt(double value,int ndigit,char *buf)

将数value转换成字符串并存于buf中,并返回buf的指针

char *ultoa(unsigned long value,char *string,int radix)

将无符号整型数value转换成字符串并返回该字符串,radix为转换时所用基数

char *ltoa(long value,char *string,int radix)

将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数

char *itoa(int value,char *string,int radix)

将整数value转换成字符串存入string,radix为转换时所用基数

double atof(char *nptr) 将字符串nptr转换成双精度数,并返回这个数,错误返回0

intatoi(char *nptr) 将字符串nptr转换成整型数, 并返回这个数,错误返回0

long atol(char *nptr) 将字符串nptr转换成长整型数,并返回这个数,错误返回0

double strtod(char *str,char **endptr)将字符串str转换成双精度数,并返回这个数,

long strtol(char *str,char **endptr,int base)将字符串str转换成长整型数,

并返回这个数,

inttoascii(int c) 返回c相应的ASCII

inttolower(int ch) 若ch是大写字母('A'-'Z')返回相应的小写字母('a'-'z')

int _tolower(int ch) 返回ch相应的小写字母('a'-'z')

inttoupper(int ch) 若ch是小写字母('a'-'z')返回相应的大写字母('A'-'Z')

int _toupper(int ch) 返回ch相应的大写字母('A'-'Z')

诊断函数,所在函数库为assert.h、math.h

void assert(int test) 一个扩展成if语句那样的宏,如果test测试失败,

就显示一个信息并异常终止程序,无返回值

void perror(char *string) 本函数将显示最近一次的错误信息,格式如下:

字符串string:错误信息

char *strerror(char *str) 本函数返回最近一次的错误信息,格式如下:

字符串str:错误信息

intmatherr(struct exception *e)

用户修改数学错误返回信息函数(没有必要使用)

double _matherr(_mexcep why,char *fun,double *arg1p,

double *arg2p,double retval)

用户修改数学错误返回信息函数(没有必要使用)

输入输出子程序,函数库为io.h、conio.h、stat.h、dos.h、stdio.h、signal.h

int kbhit()本函数返回最近所敲的按键

int fgetchar() 从控制台(键盘)读一个字符,显示在屏幕上

int getch()从控制台(键盘)读一个字符,不显示在屏幕上

int putch()向控制台(键盘)写一个字符

int getchar() 从控制台(键盘)读一个字符,显示在屏幕上

int putchar() 向控制台(键盘)写一个字符

int getche() 从控制台(键盘)读一个字符,显示在屏幕上

int ungetch(int c) 把字符c退回给控制台(键盘)

char *cgets(char *string) 从控制台(键盘)读入字符串存于string中

int scanf(char *format[,argument…])从控制台读入一个字符串,分别对各个参数进行

赋值,使用BIOS进行输出

int vscanf(char *format,Valist param)从控制台读入一个字符串,分别对各个参数进行

赋值,使用BIOS进行输出,参数从Valist param中取得

int cscanf(char *format[,argument…])从控制台读入一个字符串,分别对各个参数进行

赋值,直接对控制台作 *** 作,比如显示器在显示时字符时即为直接写频方式显示

int sscanf(char *string,char *format[,argument,…])通过字符串string,分别对各个

参数进行赋值

int vsscanf(char *string,char *format,Vlist param)通过字符串string,分别对各个

参数进行赋值,参数从Vlist param中取得

int puts(char *string) 发关一个字符串string给控制台(显示器),

使用BIOS进行输出

void cputs(char *string) 发送一个字符串string给控制台(显示器),

直接对控制台作 *** 作,比如显示器即为直接写频方式显示

int printf(char *format[,argument,…]) 发送格式化字符串输出给控制台(显示器)

使用BIOS进行输出

int vprintf(char *format,Valist param) 发送格式化字符串输出给控制台(显示器)

使用BIOS进行输出,参数从Valist param中取得

int cprintf(char *format[,argument,…]) 发送格式化字符串输出给控制台(显示器),

直接对控制台作 *** 作,比如显示器即为直接写频方式显示

int vcprintf(char *format,Valist param)发送格式化字符串输出给控制台(显示器),

直接对控制台作 *** 作,比如显示器即为直接写频方式显示,

参数从Valist param中取得

int sprintf(char *string,char *format[,argument,…])

将字符串string的内容重新写为格式化后的字符串

int vsprintf(char *string,char *format,Valist param)

将字符串string的内容重新写为格式化后的字符串,参数从Valist param中取得

int rename(char *oldname,char *newname)将文件oldname的名称改为newname

int ioctl(int handle,int cmd[,int *argdx,int argcx])

还有很多 ,由于字数上限了,就发这么多吧!

另外,虚机团上产品团购,超级便宜


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8168623.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存