一个简化的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不能被远程连接的问题
1.修改mysql配置文件 注释掉 #bind_address:127.0.0.1 2.授权账户远程连接权限 grant all priveleges on '.' To 'myuser'@'%' ...
- LFS,编译自己的Linux系统 - 准备
概述 现在用的操作系统是Win8.1,用VMware创建一个虚拟机,3G内存(物理内存是6G,分一半),23G硬盘,其中3G用于swap分区,10G用于host system,10G用于建立LFS系统 ...
- CSS3之背景色渐变
在css2时代,页面背景色渐变,按钮背景渐变效果主要是通过图片实现,css3中可通过 gradient 实现背景色渐变,图片作为一种资源,每次在页面加载时都要从服务器下载,这样如果页面很大需要渐变的效 ...
- SRAM与SDRAM的比较(转)
原文:http://blog.csdn.net/fg8181/article/details/2278100 内存在电脑中起着举足轻重的作用,一般采用半导体存储单元,包括随机存储器(RAM),只读存储 ...
- org.springframework.dao.EmptyResultDataAccessException
public Wcrash getWcrashInfo(int id) { String sql = "select plateform_id,android_version,app_ver ...
- 2014元旦第1周三新的尝试&爬山丢失望远镜
2014元旦在早起中开始,起来后看了<逃出你的肖申克>系列文章,没有精度只是选择了里面的关键语句和方法论,没有多少意外的收获.然后看了些java系列文章,关于jvm参数配置.运行监控及性能 ...
- bzoj1648 [Usaco2006 Dec]Cow Picnic 奶牛野餐
Description The cows are having a picnic! Each of Farmer John's K (1 <= K <= 100) cows is graz ...
- UESTC_冬马党 CDOJ 882
冬马党 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Statu ...
- [置顶] think in java interview番外篇-谈程序员如何修练英语
一.程序员对英语能力的重视度和能力要求应该是在各行各业中排在比较靠前的 这样说吧,英语程度的好坏直接影响着一个程序员的编程.开发.创新能力. 道理很简单: 1. 计算机和软件是用英语创造出来的 2. ...
- PHP 表单验证 - 完成表单实例
------------------------------------------------------------------------------------------- 本节展示如何在用 ...