《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函数的更多相关文章

  1. printf函数

    printf函数的格式及含义 d                    以十进制带符号的形式输出整数(对正数不输出符号) o                    以八进制无符号的形式输出整数(不输出 ...

  2. 【C语言】浅谈可变参数与printf函数

    一.何谓可变参数 int printf( const char* format, ...); 这是使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format和可变参数(用& ...

  3. printf 函数的实现原理

    /* * ===================================================================================== * * Filen ...

  4. scanf,printf函数细节

    今天笔试的时候遇到一个考察C语言scanf函数的题目 int x; float y; scanf("%3d%f",&x,&y); // input 123456 6 ...

  5. printf函数的返回值

    先看下面一段程序: 文末会给大家推荐几本好书,希望能够需要的朋友一点帮助! #include <stdio.h> int main() { int i = 123; printf(&quo ...

  6. 你真的很了解printf函数吗?

    对C语言中经常使用的printf这个库函数,你是否真的吃透了呢? 系统化的学习C语言程序设计,是不是看过一两本C语言方面的经典著作就足够了呢?答案是显而易见的:不够.通过这种典型的入门级的学习方式,是 ...

  7. 研究不定数量参数的函数并实现一个printf函数

    一.前提知识 1.如何传递参数(主函数) a.函数的参数是通过栈传递,而且是从右到左依次入栈 b.即使是char型变量,在传递参数时,也是占用两个字节,因为push操作是两个字节为单位的. c.sho ...

  8. 不定参数函数原理以及实现一个属于自己的printf函数

    一.不定参数函数原理 二.实现一个属于自己的printf函数 参考博文:王爽汇编语言综合研究-函数如何接收不定数量的参数

  9. 如果简化stm32中printf函数的使用——首先重定向

    STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印.(HAL库例程)https://blog.csdn.net/wu10188/article/details/9 ...

随机推荐

  1. 关于python的面向对象编程

    先写上代码,有代码才好理解: #filename:classdemo.py class test: '''just person''' a=1 b=2 c=0 def __init__(self): ...

  2. LigerUI 分页 MVC

    Javascirpt代码 $("#showData").ligerGrid({ columns: [ { display: '编号', name: 'L_ID', align: ' ...

  3. ASP.NET MVC 4.0 学习4-Code First

    之前我們需要用到的數據,通過添加Entity實體數據模型把數據庫中需要的Database拉到項目中如下圖, 而就是Code First就是相對於這種處理數據的方法而言的 Code First更加準確的 ...

  4. php二分查找

    // 递归版本 function bin_sch($arr,$low,$high,$val) { if($low<$high){ $mid = intval(($low+$high)/2); i ...

  5. HTML骨架-深入理解

    HTML是WEB开发最基本的语言之一,也是最重要的语言之一,我们在浏览网页时做看到的内容是最直接的呈现形式就是HTML代码.<!DOCTYPE html PUBLIC "-//W3C/ ...

  6. 转:ReportViewer控件使用方法

    a. ReportViewer关联Report1.rdlc的简单呈现b. 对带有报表参数的Report1.rdlc的呈现c. 利用程式生成的DataSet 填充报表d. 调用存储过程 生成DataSe ...

  7. Repeated DNA Sequences 解答

    Question All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: ...

  8. HTML5 Canvas绘图系列之一:圆弧等基础图形的实现

    之前的一个微信项目已经要结项了,最近整理一下项目中使用较多的canvas画图方面的知识吧,打算写个3,4篇的样子.本篇主要介绍基础操作和弧线画法. 之后再写一下趋势图,直方图,文本图像处理的. 言归正 ...

  9. FP-Growth算法之频繁项集的挖掘(python)

    前言: 关于 FP-Growth 算法介绍请见:FP-Growth算法的介绍. 本文主要介绍从 FP-tree 中提取频繁项集的算法.关于伪代码请查看上面的文章. FP-tree 的构造请见:FP-G ...

  10. iOS蓝牙4.0开发例子

    1建立中心角色 1 2 3 #import <CoreBluetooth/CoreBluetooth.h>  CBCentralManager *manager;  manager = [ ...