随笔-141  评论-9  文章-3  trackbacks-0
练习 7.11
      写一个error函数,它取一个printf风格的包含%s、%c和%d指示符的格式串, 以及任意多个其他参数。请不要使用printf()。

解:
      对于变动长度参数表的处理通过一些很像对待器的设施完成,这类设施的类型为va_list。宏va_start对这类设施进行初始化,还必须用宏va_end指明这种设施不会再用。要取得当前参数的值并将该设施移到下一个参数, 需要用va_arg。参数表的结束必须能从至今已经看到的实际参数确定(典型情况下,函数从没有省略号表示的某个常规参数哪里获得有关信息。)

#include <cassert>
#include 
<cstdarg>
#include 
<iostream>
#include 
<stdexcept>

using namespace std;

void error(char const * fmt, ){
        assert(fmt);
        va_list p;
        va_start(p, fmt);
        
for(char const *s=fmt; *s; ++s)
                
if(*s!='%')
                        cerr.put(
*s);
                
else
                        
switch(*(++s)){
                        
case '%': cerr.put('%'); break;
                        
case 's': cerr<<va_arg(p, char const *); break;
                        
case 'c': cerr<<(char)va_arg(p, int); break;
                        
case 'd': cerr<<va_arg(p, int); break;
                        
default:
                                
throw domain_error("error");
                        }

        va_end(p);
}


int main(){
        error(
"A string \"%s\", a single character \'%c\', an integer %d\n","Hello World"'$'12345);
        
return 0;
}

       
posted on 2011-03-12 22:25 小阮 阅读(320) 评论(0)  编辑 收藏 引用 所属分类: C++程序设计语言

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理