- #include <string.h>
-
#include <stdlib.h>
-
#include <stdio.h>
-
#include <iostream>
-
#include <stdarg.h>
-
#define OK 0
-
using namespace std;
-
void minprintf(char *,...);
-
int main(){
-
cout<<"可变长度参数列表的简单实现"<<endl;
-
int i = 5;
-
char ch = 'c';
-
char *s = "test";
-
double dou=1.005;
-
minprintf("%dx%sx%cxxxx%f",i,s,ch,dou);
-
getchar();
-
return OK;
-
}
-
void minprintf(char * fmt,...){
-
va_list ap;
-
char *p=NULL,*sval=NULL;
-
int ival=0;
-
double dval=0.0;
-
char cval='d';
-
va_start(ap,fmt);
-
for(p = fmt;*p; p++){
-
if(*p != '%'){
-
putchar(*p);
-
continue;
-
}
-
p++;
-
switch (*p){
-
case 'd':
-
ival=va_arg(ap,int);
-
printf("%d",ival);
-
break;
-
case 'f':
-
dval=va_arg(ap,double);
-
printf("%6.3f",dval);
-
break;
-
case 's':
-
sval=va_arg(ap,char *);
-
for(;*sval;sval++){
-
putchar(*sval);
-
}
-
break;
-
case 'c':
-
cval=(char)va_arg(ap,int);
-
putchar(cval);
-
break;
-
default :
-
putchar(*p);
-
break;
-
}
-
}
-
va_end(ap);
-
}
偶然看到k&r中有个可变长度参数列表的程序,自己跑了一下,不跑不知道,一跑下一跳啊,在书中
作者对va_arg 中第二个参数为数据类型做了测试,其中包括,%d,%f,%s ,偶略做扩展,增加了一个格式控制%c,然后问题就悄然出现了,竟然提示非法指令,地址访问越界,
cval=va_arg(ap,char);
调试的时候,到这一条程序语句程序就出问题,偶无奈之下,只好百度,然后在gcc-bug 看到这样一段:
|
这样,char short 就会默认提升为int,这样程序就出现非法指令,。。。。。解决办法是
cval=(char)va_arg(ap,int);
偶然发现,呵呵,
阅读(1359) | 评论(0) | 转发(0) |