前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础知识 | 每日一练(135)

基础知识 | 每日一练(135)

作者头像
小林C语言
发布2019-10-10 16:39:39
3850
发布2019-10-10 16:39:39
举报

基础知识练习

士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ——菜根谭

读者:怎样写类似 printf() 的函数, 再把参数转传给 printf() 去完成大部分工作?

小林:用 vprintf(), vfprintf() 或 vsprintf()。下面是一个 error() 函数, 它列印一个出错信息, 在信息前加入字符串 “error: ”和在信息后加入换行符:

#include <stdio.h>

#include <stdarg.h>

void error(const char *fmt, ...)

{

va_list argp;

fprintf(stderr, "error: ");

va_start(argp, fmt);

vfprintf(stderr, fmt, argp);

va_end(argp);

fprintf(stderr, "\n");

}

读者:怎样知道实际上有多少个参数传入函数?

小林:这一段信息不可移植。一些旧系统提供一个非标准函数 nargs()。然而它的可信度值得怀疑, 因为它的典型返回值是参数的字节长度, 而不是参数的个数。结构、整数和浮点类型的值一般需要几个字节的长度。

任何接收可变参数的函数都应该可以从传入的参数本身来得到参数的数目。类 printf 函数从格式字符串中的格式说明符来确定参数个数, 就象 %d 这样的格式说明符。所以如果格式字符串和参数数目不符时, 此类函数会出错的很厉害。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 C语言入门到精通 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档