c语言中的printf()这样的有不定个参数的函数是如何实现的首先先看到main函数中的不定参数:
1.引用:在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env 。
* argc:整数, 鴐ain()的命令行参数个数 。
* argv:字符串数组 。
argv[0] 为程序运行的全路径名
argv[1] 为在DOS命令行中执行程序名后的第一个字符串;
argv[2] 为执行程序名后的第二个字符串;
...
argv[argc]为NULL 。
*env:字符串数组 。env[] 的每一个元素都包含ENVVAR=value形式的字符
串 。其中ENVVAR为环境变量 。value 为ENVVAR的对应值
#include stdlib.h
#include stdio.h
main(int argc, char *argv[], char *env[])
{
int i;
printf("%d\n", argc);/* 为什么它的输出是 1, 它到底是定义什么的 , 我看不明上面的解释*/
for(i=0; i=argc; i)
printf("argv[%d]:%s\n", i, argv[i]);
for(i=0; env[i]!=NULL; i)
printf(" env[%d]:%s\n", i, env[i]);
}
argc, argv, env是在main()函数之前被赋值的,编译器生成的可执行文件,main()不是真正的入口点,而是一个标准的函数,这个函数名与具体的操作系统有关 。
就想到其他函数是否能实现一样的功能,查询了相关资料 , 基本上都是利用STDARG.H中的
#define va_start(ap, parmN) (ap = ...)
#define va_arg(ap, type) (*((type *)(ap)))
#define va_end(ap)
定义如下:
typedef char *va_list;
#define va_start _crt_va_start
#define va_arg _crt_va_arg
#define va_end _crt_va_end
#define _crt_va_start(ap,v)( ap = (va_list)_ADDRESSOF(v)_INTSIZEOF(v) )
#define _crt_va_arg(ap,t)( *(t *)((ap= _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap)( ap = (va_list)0 )
修改他人程序如下:
void average(int first,...)
{int i=first;
va_list maker;
va_start(maker,first);
while(i!=-1){ printf("%p: %d\n",maker,i);
i=va_arg(maker,int);
}
}
void main(void)
{
average(2,3,4,4,-1);
}
运行结果:
FFCE: 2
FFD0: 3
FFD2: 4
FFD4: 4
这个程序显示函数参数的地址相差2个字节
所以可以改写为:
void x(char *n,...)
{int *p;
p=n;
while(*p!=-1)
{printf("%p:%s\n",p,*p,*p);
p =sizeof(char);}}
void main()
{x("g","hfd","gfg","vsds",-1);}
运行结果:
FFD2:g
FFD4:hfd
FFD6:gfg
FFD8:vsds
不必通过宏va_start,va_arg,va_end实现
c语言问题,不定长参数这样的输出结果是不确定的!
-------
分析:你在args函数中对不定参进行遍历,但要求最后是0时跳出循环,
显然main中的数据不符合要求,导致遍历溢出,结果难以预测 。
-------
修正:
void main(){
args(1,2,0);
}
输出:
2
C语言不定长参数的问题说的有点混乱c语言函数不定参数怎么办,提供几个方法 。1,你的WHILE另开一个线程.2做一个LIST保存每个LOG的信息,每个信息是NEW出来的 。
说实话,c语言函数不定参数怎么办我还是没明白你补充的意思 。
我写个伪代码吧,希望能有点启发
list LOG_INFO* info_list;
while ()
{
...//some function
//new出来的东西在堆上,不会被释放掉 , 所以一直都存在
LOG_INFO* log_info = new LOG_INFO();
//放到炼表里保存指针
info_list.push_back(log_info);
...//some function
}
output_log(info_list);//把炼表给输出的函数
release_info(info_list);//释放new的东西 。
基本是这个意思,就是你new出来的东西不会被释放.
另外log_info可以是一个类,里面变的东西都可以设置,当然有的东西没有可以不设置.因为具体问题不清楚,所以可能更优化.
而输出的时候是根据类里面的成员变量进行输出的.
举例:
比如可能输出的是字符串也可能输出图片那么可以定义如下
class Info
{
string str;
Image image;
bool is_str;
bool is_image;
}
然后判断到底有什么,当然也可以用指针等其他方法进行数据结构的优化.
C语言怎么实现函数不定参数C语言中定义c语言函数不定参数怎么办了va_list, va_start( ), va_arg( ), va_end( ) 这样一组宏来处理可变参数问题 。
可以参考printfc语言函数不定参数怎么办的声明c语言函数不定参数怎么办,创建自己的实现函数 。示例c语言函数不定参数怎么办:
#includestdio.h
#includestdarg.h
void va_fun(int start,...)
{
va_list arg_ptr;
int nArgValue = https://www.04ip.com/post/start;
int nArgCount = 1;
va_start(arg_ptr,start);
while(nArgValue != -1)
{
printf("arg %d is:%d/n",nArgCount,nArgValue);
nArgValue=https://www.04ip.com/post/va_arg(arg_ptr,int);
nArgCount;
}
return;
}
main()
{
va_fun(5,1,7,-1);
printf("................/n");
va_fun(2,4,-1);
printf("................/n");
va_fun(-1);
【c语言函数不定参数怎么办 c语言 不定参数】 printf("................/n");
//va_fun(); 可变参数函数最少要有一个参数 。
}
请问c语言编写函数时不确定 参数数量时该怎么办在函数定义的时候就必须写形参名了 。声明的时候不需要,因为编译器还用不到,只要知道相应位置是个啥类型的就行了
c语言函数不定参数怎么办的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言 不定参数、c语言函数不定参数怎么办的信息别忘了在本站进行查找喔 。
推荐阅读
- 古风经营游戏图,古风经营手机游戏
- 车神是什么拍摄的,车神结局
- 文档如何转换成pdf结构,word转pdf文档结构图怎么弄
- mysql怎么查取列名 mysql 获取列名
- 直播都是干什么的,直播都是干什么的正规吗
- 拍摄花絮用什么背景,拍摄花絮背景音乐
- sqlserver查询自增,sqlsever自增id
- go语言精妙之处 go语言性能怎么样
- net安装不成功,net安装不成功hresult