一个简化的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 ...
随机推荐
- Fatal error: Undefined class constant 'MYSQL_ATTR_USE_BUFFERED_QUERY' in D:\inetpub\vhosts\zenpty.com\httpdocs\includes\database
打开php.ini配置文件,找到php_pdo_mysql.dll,如果前面有分号";"则表示该行被注释掉了,将分号去掉,保存,然后重启apache服务,重新访问页面,问题解决了.
- ZendFramework2 源码分析 init_autoloader.php
// Composer autoloading if (file_exists('vendor/autoload.php')) { // 加载自动加载器 $loader = include 'vend ...
- find系列之xargs命令
xargs的功能--> 将标准输入转换为命令行参数,供后面的命令调用,但是一次只能依据-d和-n限定的行数来推送一行 xargs的作用--> 使那些不能利用stdin的命令 ...
- C# is 与 as 运算符
as运算符有一定的适用范围,它只适用于引用类型或可以为null的类型,而无法执行其他的转换,如值类型的转换以及用户自定义的类型转换,这类转换应该适用强制转换表达式来执行.as当转换不了的时候返回nul ...
- C# unsafe code
(*) unsafe 和 fixed unsafe { ]; ; i < array.Length; i++) { arra ...
- Regex类
一.属性 CacheSize 获取或设置已编译的正则表达式的当前静态缓存中的最大项数. 默认是15个,最近使用的15个会存在缓存中,避免重新创建.当有第16个进来会替换掉第 1个.保持15个.Opt ...
- 理解*ptr++
这是C语言中指针的基本用法之一,我们先来看一个小例子.下面是代码: int main(void) { char *p = "Hello"; while(*p++) printf(& ...
- 基于spark的plsa实现
PLSA.py # coding:utf8 from pyspark import SparkContext from pyspark import RDD import numpy as np fr ...
- ObjectOutputStream 追加写入读取错误
摘自http://blog.csdn.net/mitkey/article/details/50274543 问题描述: 用类ObjectOutputStream向文件写读对象时,碰到一个问题:新建一 ...
- PHP 表单验证 - 必填字段
-------------------------------------------------------------------------- 本节展示如何制作必填输入字段,并创建需要时所用的错 ...