int eprintf(const char *fmt, ...)形参中的...是什么意思啊?请教鸟
int eprintf(const char *fmt, ...)
{
va_list argp;
va_start(argp, fmt);
return(_doprnt(fmt, argp));
}
问题点数:20、回复次数:5Top
1 楼jinjiajie(leorio)回复于 2006-03-02 11:47:05 得分 0
就是可以有多个,根据前面的而改变的意思Top
2 楼ouyh12345(五岭散人)回复于 2006-03-02 11:47:13 得分 0
可变参数。
fmt确定参数插入的位置。
...为参数
Top
3 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2006-03-02 12:52:54 得分 0
...表示实参个数不定,这是可变参数函数定义。Top
4 楼ugg(逸学堂(exuetang.net))回复于 2006-03-02 13:31:00 得分 0
VA函数(variable argument function),参数个数可变函数,又称可变参数函数。C/C++编程中,系统提供给编程人员的va函数很少。*printf()/*scanf() 系列函数,用于输入输出时格式化字符串;exec*()系列函数,用于在程序中执行外部文件(main(int argc, char* argv[]算不算呢,与其说main()也是一个可变参数函数,倒不如说它是exec*()经过封装后的具备特殊功能和意义的函数,至少在原理这一级上有很多相似之处)。由于参数个数的不确定,使va函数具有很大的灵活性,易用性,对没有使用过可变参数函数的编程人员很有诱惑力;那么,该如何编写自己的 va函数,va函数的运用时机、编译实现又是如何。作者借本文谈谈自己关于va函数的一些浅见。
http://www.exuetang.net/article/View.aspx?NewsID=172Top
5 楼ws_lzy(alan_luo)回复于 2006-03-02 17:54:38 得分 0
事实上这是采用堆栈传递不定参数的方法:
具体做法请看我写的如下代码,两个版本,一个是c++一个是汇编,
一切尽在程序中。<当然,当前函数只能处理%d和%s如果需要扩展,请自行处理:)>
//组装字符串函数 by lzy
void sprintf_c(char* ptrDst,const char* ptrMsg,...){
int index=1;
while(*ptrDst++=*ptrMsg++){
if(*(ptrDst-1)=='%'){
ptrDst--;
switch(*ptrMsg){
case 'd':
{
ptrMsg++;
char value[32],*ptr;
ptr=_ltoa((*((long*)((int*)(&(ptrMsg))+index++)))++, value, 10);
while(ptr && *ptr && (*ptrDst++=*ptr++));
}
break;
case 's':
{
ptrMsg++;
char* ptr=(char*)((*((long*)((int*)(&(ptrMsg))+index++)))++);
while(ptr && *ptr && (*ptrDst++=*ptr++));
}
break;
default:
break;
}
}
}
}
//组装字符串函数 by lzy
__declspec(naked) sprintf_asm(char* ptrDst,const char* ptrMsg,...)
{
__asm{
push ebp
mov ebp,esp
push ebx
push edi
push esi
mov edi,ptrDst
lea esi,[ebp+0x10]//定位到可变参数在堆栈中的地址
cld
mov ebx,ptrMsg
nloopz:
mov al,byte ptr[ebx]
mov byte ptr[edi],al
inc ebx
inc edi
cmp al,'%'
jz cmdProc
or al,al
jz t_exit
jmp nloopz
cmdProc:
dec edi
mov al,byte ptr[ebx]
cmp al,'s'
jz getParamSTR
cmp al,'d'
jz getParamINT
jmp nloopz
getParamINT:
lodsd
//得到参数
inc ebx
push ebx
lea ebx,[esp-4]
sub esp,0x20
mov byte ptr[ebx],0
dec ebx
mov ecx,0xa
spret:
xor edx,edx
div ecx
add dl,0x30
mov byte ptr[ebx],dl
or eax,eax
jz spretEnd
dec ebx
jmp spret
spretEnd:
add esp,0x20
mov eax,ebx
pop ebx
jmp appendStr
getParamSTR:
lodsd
inc ebx
appendStr:
mov edx,esi
mov esi,eax
copyStr_in:
lodsb
or al,al
jz t_ret
stosb
jmp copyStr_in
t_ret:
mov esi,edx
jmp nloopz
t_exit:
pop esi
pop edi
pop ebx
pop ebp
ret
}
}Top
相关问题
- const char* const* const* p;
- void myfunc( const char *fmt, ...)?这里面的参数是怎么回事?
- operator char*() const {return ...;}
- const char *和ansistring
- const char * 如何变成char *?
- const char *iceCream[]与const char iceCream[]不同
- char const *p和char * const p区别?
- static const char*问题
- 请问这几个的区别const char * pstr; char* const pstr;const char* const pstr;
- bool operator==(const char* sz); and operator const char* () const; 两句话什么意思?




