一个简化的printf函数
《C和指针》第7章第5道编程题:
实现一个简化的printf函数,它能够处理%d、%f、%s 和 %c 格式码,根据ANSI标准的原则,其他格式码的行为是未定义的。你可以假定已经存在函数 printf_integer 和 printf_float,用于打印这些类型的值。对于另外两个类型的值,使用 putchar 来打印。
答案参考百度知道
/*
** 实现一个简易的printf函数
** 它能处理%d, %f, %s,%c格式码
*/ #include <stdarg.h> //处理可变参数列表
#include <stdio.h> int putchar( int c );
int printf_int( int i ){;} // 假定printf_int函数用于打印int类型的值
int printf_float( float f ){;} // 假定printf_float函数用于打印float类型的值 int my_printf( char *fmt, ... ); int
main()
{
my_printf( "integer test: %d\n", ); // 由于printf_int函数是假定的,实际不能打印数值
my_printf( "float test: %f\n", 0.5 ); // 由于printf_float函数是假定的,实际不能打印数值
my_printf( "string test: %s\n", "abcdefg" );
my_printf( "char teat: %c\n", 'A' );
my_printf( "%d %f %s %c\n", , 4.124, "ABC", 'h' );
return ;
} /*
** 函数,实现简易的printf函数
*/
int
my_printf( char *fmt, ... )
{
va_list prtf_list;
char *fp; // 指向fmt字符串
char *sval; // 要输出的字符串
int ival; // 要输出的整数
float fval; // 要输出的浮点数
char cval; va_start( prtf_list, fmt ); for( fp = fmt; *fp != '\0'; ++ fp )
{
/*
** 如果没遇到%,则直接输出字符
** 并处理下一个字符
*/
if( *fp != '%' )
{
putchar( *fp );
continue;
} /*
** 如果遇到%,则看下一个字符
** 根据格式输出
*/
switch( *++fp )
{
case 'd':
ival = va_arg( prtf_list, int ); // 从参数列表中获取一个int类型的值
printf_int( ival );
break;
case 'f':
fval = va_arg( prtf_list, double ); // 从参数列表中获取一个float类型的值
printf_float( fval );
break;
case 's':
// 从参数列表中获取一串字符,并逐个输出
for( sval = va_arg( prtf_list, char * ); *sval != '\0'; ++ sval )
putchar( *sval );
break;
case 'c':
cval = va_arg( prtf_list, int ); //从参数列表中获取一个字符并输出
putchar( cval );
break;
default:
break;
}
} va_end( prtf_list ); return ;
}
一个简化的printf函数的更多相关文章
- printf函数
printf函数的格式及含义 d 以十进制带符号的形式输出整数(对正数不输出符号) o 以八进制无符号的形式输出整数(不输出 ...
- 【C语言】浅谈可变参数与printf函数
一.何谓可变参数 int printf( const char* format, ...); 这是使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format和可变参数(用& ...
- printf 函数的实现原理
/* * ===================================================================================== * * Filen ...
- scanf,printf函数细节
今天笔试的时候遇到一个考察C语言scanf函数的题目 int x; float y; scanf("%3d%f",&x,&y); // input 123456 6 ...
- printf函数的返回值
先看下面一段程序: 文末会给大家推荐几本好书,希望能够需要的朋友一点帮助! #include <stdio.h> int main() { int i = 123; printf(&quo ...
- 你真的很了解printf函数吗?
对C语言中经常使用的printf这个库函数,你是否真的吃透了呢? 系统化的学习C语言程序设计,是不是看过一两本C语言方面的经典著作就足够了呢?答案是显而易见的:不够.通过这种典型的入门级的学习方式,是 ...
- 研究不定数量参数的函数并实现一个printf函数
一.前提知识 1.如何传递参数(主函数) a.函数的参数是通过栈传递,而且是从右到左依次入栈 b.即使是char型变量,在传递参数时,也是占用两个字节,因为push操作是两个字节为单位的. c.sho ...
- 不定参数函数原理以及实现一个属于自己的printf函数
一.不定参数函数原理 二.实现一个属于自己的printf函数 参考博文:王爽汇编语言综合研究-函数如何接收不定数量的参数
- 如果简化stm32中printf函数的使用——首先重定向
STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印.(HAL库例程)https://blog.csdn.net/wu10188/article/details/9 ...
随机推荐
- 解决MYSQL弃用模块错误Deprecated: mysql_query(): The mysql extension is deprecated and will be removed in the future
今天使用了mysql 5.5版本,就出现了错误.错误提示如下: Deprecated: mysql_connect(): The mysql extension is deprecated and w ...
- 使用Calendar增加日期
/** * @Description: 当前日期加上n个月返回long date */ public static long getLongDateAddMonth(int n){ Calendar ...
- SQL Server 2008空间数据应用系列四:基础空间对象与函数应用
原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. ...
- cf471A MUH and Sticks
A. MUH and Sticks time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- 微软雅黑 firefox Css 设置 font-family: "microsoft yahei","\5FAE\8F6F\96C5\9ED1","宋体";
font-family: "microsoft yahei","\5FAE\8F6F\96C5\9ED1","宋体"; // 这里用引 ...
- 【转】morgan stanley 电面面经新鲜出炉
楼楼早上上午大概11点接到的电话,一个声音炒鸡好听的GG,说他是来自morgan stanley的,想和我约一下店面时间.我一听,真是戳不及防,掐指一算,online的IKE测试已经过去20几天了吧, ...
- 关于随机数字K线极值的统计结果
如果有组随机数字,如数字彩票.我们对号码进行平均二分后,统计期出现的结果分布,对结果分布进行K线累加,得到一条折线. 这条折线的顶点和底点的统计上服从以下规则: 令总期数为N,统计区间为M,则在N期内 ...
- 什么是FastCGI?
什么是FastCGI? PHP的FastCGI使你的所有php应用软件通过mod_fastci运行,而不是mod_phpsusexec.FastCGI应用速度很快 是因为他们持久稳定.不必对每一个请求 ...
- IOS添加多个按钮在导航栏
UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 75.0f, 30.0f)]; UIButton * ...
- Java程序猿的JavaScript学习笔记(汇总文件夹)
最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...