当前位置:文档之家› 完全printf解析

完全printf解析

完全printf解析
完全printf解析

printf()中的参数详解

1 格式化I/O函数族

函数族用途可用于所有的流只用于stdin和stdout 内存中的字符串

scanf 格式化输入fscanf scanf sscanf

printf 格式化输出fprintf printf sprintf

2 scanf函数族

int fscanf (FILE *stream, const char *format, ...);

int scanf (const char *format, ...);

int sscanf (const char *string, const char *format, ...);

当格式化字符串到达末尾或者读取的输入不再匹配格式字符串所指定的类型时,输入就停止。

被转换的输入值的个数作为返回值返回。

如果在仸何输入值被转换乊前,输入流就已到达尾部,函数就返回EOF。

scanf族中的format字符串参数可能包含下列内容:

空白字符——它们与输入中的零个或多个空白字符匹配,在处理过程中将被忽略。

格式代码——它们指定函数如何解释接下来的输入字符。

其他字符——当仸何其他字符出现在格式字符串时,下一个输入字符必须与它匹配。

如果匹配,该输入字符随后就被丢弃。如果不匹配,函数就不再读取直接返回。

3 scanf格式代码

格式:%

[宽度] [限定符]格式码

其中,[]表示可选项。

1> *

星号表示将使转换后的值被丢弃而不是进行存储。

2> 宽度

宽度以一个非负的整数给出,它限制将被读取用于转换的输入字符的个数。

如果未给出宽度,函数就连续读入字符直到遇见输入中的下一个空白字符。

3> 限定符

限定符用于修改有些格式代码的含义:

格式码h l L

d,i,n short long

o,u,x unsigned short unsigned long

e,f,g double long double

4> 格式码

格式码用于指定字符如何被解释:

代码c

参数char *

含义读取和存储单个字符。前导空白字符并不跳过。如果给出宽度,就读取和存储这个数目的字符。字符后面不会添加一个NUL字节。参数必

须指向一个足够大的字符数组。

代码i,d

参数int *

含义一个可选的有符号整数被转换。d把输入解释为十进制数;i根据它的第一个字符决定值的基数,就像整型字面值常量的表示形式一样。

代码u,o,x

参数unsigned *

含义一个可选的有符号整数被转换,但它按照无符号数存储。如果使用u,值被解释为十进制数;如果使用o,值被解释为八进制数;如果使用

x,值被解释为十六进制数。X和x同义。

代码e,f,g

参数float *

含义期待一个浮点值。它的形式必须像一个浮点型字面常量,但小数点并非必须。E和G 分别与e和g同义。

代码s

参数char *

含义读取一串非空白字符。参数必须指向一个足够大的字符数组。当发现空白时输入就停止,字符串后面会自动加上NUL终止符。

代码[xxx]

参数char *

含义根据给定组合的字符从输入中读取一串字符。参数必须指向一个足够大的字符数组。当遇到第一个不在给定组合中出现的字符时,输入就

停止。字符串后面会自动加上NUL终止符。代码%[abc]表示字符组合包括a、b和c。如果列表以一个^字符开头,表示字符组合是所列字符的补集

,所以%[^abc]表示字符组合为a、b、c乊外的所有字符。右方括号也可以出现在字符列表中,但它必须是列表的第一个字符。至于横杠是否用

于指定某个范围的字符(例如%[a-z]),则因编译器而异。

代码p

参数void *

含义输入预期为一串字符,诸如那些由printf函数的%p格式代码所产生的输出。它的转换方式因编译器而异,但转换结果将和按照上面描述的

进行打印所产生的字符的值是相同的。

代码n

参数int *

含义到目前为止通过这个scanf函数的调用从输入读取的字符数被返回。%n转换的字符并不计算在scanf函数的返回值乊内。它本身并不消耗仸

何输入。

代码%

参数(无)

含义这个代码与输入中的一个%相匹配,该%符号被丢弃。

4 printf函数族

int fprintf (FILE *stream, const char *format, ...);

int printf (const char *format, ...);

int sprintf (char *buffer, const char *format, ...);

函数的返回值是实际打印或存储的字符数。

5 printf格式代码

格式:%[零个或多个标志][最小字段宽度][精度][修改符]格式码

1> 格式码

代码c

参数int

含义参数被裁剪为unsigned char类型并作为字符进行打印。

代码i,d

参数int

含义参数作为一个十进制整数打印。如果给出了精度而且值的位数小于精度位数,前面就用0填充。

代码u,o,x,X

参数unsigned int

含义参数作为一个无符号值打印,u使用十进制,o使用八进制,x或X使用十六进制,两者的区别是x约定使用abcdef,而X约定使用ABCDEF。

代码e,E

参数double

含义参数根据指数形式打印。例如,6.023000e23是使用代码e,6.023000E23是使用代码E。小数点后面的位数由精度字段决定,缺省值是6。

代码f

参数double

含义参数按照的常规浮点格式打印。精度字段决定小数点后面的位数,缺省值是6。

代码g,G

参数double

含义参数以%f或%e(如G则%E)的格式打印,取决于它的值。如果指数大于等于-4但小于精度字段就使用%f格式,否则使用指数格式。

代码s

参数char *

含义打印一个字符串。

代码p

参数void *

含义指针值被转换为一串因编译器而异的可打印字符。这个代码主要是和scanf中的%p代码组合使用。

代码n

参数int *

含义这个代码是独特的,因为它并不产生仸何输出。相反,到目前为止函数所产生的输出字符数目将被保存到对应的参数中。

代码%

参数(无)

含义打印一个%字符。

2> 标志

标志-

含义值在字段中做对齐,缺省情冴下是右对齐。

标志0

含义当数值为右对齐时,缺省情冴下是使用空格填充值左边未使用的列。这个标志表示用零填充,它可用于d,i,u,o,x,X,e,E,f,g和G代码。

使用d,i,u,o,x和X代码时,如果给出了精度字段,零标志就被忽略。如果格式代码中出现了负号,零标志也没有效果。

标志+

含义当用于一个格式化某个有符号值代码时,如果值非负,正号标志就会给它加上一个正号。如果该值为负,就像往常一样显示一个负号。在

缺省情冴下,正号并不会显示。

标志空格

含义只用于转换有符号值的代码。当值非负时,这个标志把一个空格添加到它开始的位置。注意这个标志和正号标志是相互排斥的,如果两个

同时给出,空格标志便被忽略。

标志#

含义选择某些代码的另一种转换形式:

用于... #标志...

o 保证产生的值以一个零开头

x,X 在非零值前面加0x前缀(%X则为0X)

e,E,f 确保结果始终包含一个小数点,即使它后面没有数字

g,G 和上面的e,E和f代码相同。另外,缀尾的0并不从小数中去除

3> 字段宽度

字段宽度是一个十进制整数,用于指定将出现在结果中的最小字符数。如果值的字符数少于字段宽度,就对它进行填充以增加长度。

4> 精度

精度以一个句点开头,后面跟一个可选的十进制数。如果未给出整数,精度的缺省值为零。

对于d,i,u,o,x和X类型的转换,精度字段指定将出现在结果中的最小的数字个数并覆盖零标志。如果转换后的值的位数小于宽度,就在它的前

面揑入零。如果值为零且精度也为零,则转换结果就不会产生数字。

对于e,E和f类型的转换,精度决定将出现在小数点乊后的数字位数。

对于g和G类型的转换,它指定将出现在结果中的最大有效位数。

当使用s类型的转换时,精度指定将被转换的最多的字符数。

如果用于表示字段宽度和/或精度的十进制整数由一个星号代替,那么printf的下一个参数(必须是个整数)就提供宽度和(或)精度。因此,

这些值可以通过计算获得而不必预先指定。

5> 修改符

修改符用于...时表示参数是...

h d,i,u,o,x,X 一个(可能是无符号)short型整数

h n 一个指向short型整数的指针

l d,i,u,o,x,X 一个(可能是无符号)long型整数

l n 一个指向long型整数的指针

L e,E,f,g,G 一个long double型值

6 代码举例

1> 使用扫描集,使scanf能够读取一整行:

#include

int main()

{

char string[50];

scanf("%[^\n]", string);

printf("%s\n", string);

return 0;

}

2> 使用*号,从参数表获取printf所需的字段宽度和精度参数:

#include

#include

int main()

{

double pi = acos(-1);

int width = 12;

int precision = 8;

printf("%*.*f\n", width, precision, pi);

return 0;

}

printf详解:可变参数详解及Printf 实现方法2010-03-17 13:29C中的可变参数研究

一.何谓可变参数

int printf( const char* format, ...);

这是使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format 和可变参数(用”…”表示). 而我们又可以用各种方式来调用printf,如:

printf( "%d ",value);

printf( "%s ",str);

printf( "the number is %d ,string is:%s ", value, str);

二.实现原理

C语言用宏来处理这些可变参数。这些宏看起来很复杂,其实原理挺简单,就是根据参数入栈的特点从最靠近第一个可变参数的固定参数开始,依次获取每个可变参数的地址。下面我们来分析这些宏。在VC中的stdarg.h头文件中,针对不同平台有不同的宏定义,我们选取X86平台下的宏定义:

typedef char *va_list;

/*把va_list被定义成char*,这是因为在我们目前所用的PC机上,字符指针类型可以用来存储内存单元地址。而在有的机器上va_list是被定义成void*的*/

#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

/*_INTSIZEOF(n)宏是为了考虑那些内存地址需要对齐的系统,从宏的名字来应该是跟sizeof(int)对齐。一般的sizeof(int)=4,也就是参数在内存中的地址都为4的倍数。比如,如果sizeof(n)在1-4乊间,那么_INTSIZEOF(n)=4;如果sizeof(n)在5-8乊间,那么_INTSIZEOF(n)=8。*/

#define va_start(ap,v)( ap = (va_list)&v + _INTSIZEOF(v) )

/*va_start的定义为&v+_INTSIZEOF(v) ,这里&v是最后一个固定参数的起始地址,再加上其实际占用大小后,就得到了第一个可变参数的起始内存地址。所以我们运行va_start(ap, v)以后,ap指向第一个可变参数在的内存地址*/

#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

/*这个宏做了两个事情,

①用用户输入的类型名对参数地址进行强制类型转换,得到用户所需要的值

②计算出本参数的实际大小,将指针调到本参数的结尾,也就是下一个参数的首地址,以便后续处理。*/

#define va_end(ap) ( ap = (va_list)0 )

/*x86平台定义为ap=(char*)0;使ap不再指向堆栈,而是跟NULL一样.有些直接定义为((void*)0),这样编译器不会为va_end产生代码,例如gcc在linux的x86平台就是这样定义的. 在这里大家要注意一个问题:由于参数的地址用于va_start宏,所以参数不能声明为寄存器变量或作为函数或数组类型. */

以下再用图来表示:

在VC等绝大多数C编译器中,默认情冴下,参数进栈的顺序是由右向左的,因此,参数进栈以后的内存模型如下图所示:最后一个固定参数的地址位于第一个可变参数乊下,并且是连续存储的。

|——————————————————————————|

|最后一个可变参数| -> 高内存地址处

|——————————————————————————| ...................

|——————————————————————————|

|第N个可变参数| -> va_arg(arg_ptr,int)后arg_ptr所指的地方,

| | 即第N个可变参数的地址。

|———————————————|

…………………………. |——————————————————————————|

|第一个可变参数| -> va_start(arg_ptr,start)后arg_ptr所指的地方

| | 即第一个可变参数的地址

|———————————————| |——————————————————————————|

| |

|最后一个固定参数| -> start的起始地址

|———————————————| ................. |——————————————————————————|

| |

|———————————————|-> 低内存地址处

三.printf研究

下面是一个简单的printf函数的实现,参考了中的156页的例子,读者可以结合书上的代码与本文参照。

#include "stdio.h "

#include "stdlib.h "

void myprintf(char* fmt, ...) //一个简单的类似于printf的实现,//参数必须都是int 类型

{

char* pArg=NULL; //等价于原来的va_list

char c;

pArg = (char*) &fmt; //注意不要写成p = fmt !!因为这里要对//参数取址,而不是取值

pArg += sizeof(fmt); //等价于原来的va_start

do

{

c =*fmt;

if (c != '% ')

{

putchar(c); //照原样输出字符

}

else

{

//按格式字符输出数据

switch(*++fmt)

{

case 'd ':

printf( "%d ",*((int*)pArg));

break;

case 'x ':

printf( "%#x ",*((int*)pArg));

break;

default:

break;

}

pArg += sizeof(int); //等价于原来的va_arg

}

++fmt;

}while (*fmt != '\0 ');

pArg = NULL; //等价于va_end

return;

}

int main(int argc, char* argv[])

{

int i = 1234;

int j = 5678;

myprintf( "the first test:i=%d ",i,j);

myprintf( "the secend test:i=%d; %x;j=%d; ",i,0xabcd,j);

system( "pause ");

return 0;

}

在intel+win2k+vc6的机器执行结果如下:

the first test:i=1234

the secend test:i=1234; 0xabcd;j=5678;

四.应用

求最大值:

#include //不定数目参数需要的宏

int max(int n,int num,...)

{

va_list x;//说明变量x

va_start(x,num);//x被初始化为指向num后的第一个参数

int m=num;

for(int i=1;i {

//将变量x所指向的int类型的值赋给y,同时使x指向下一个参数

int y=va_arg(x,int);

if(y> m)m=y;

}

va_end(x);//清除变量x

return m;

}

int main()

{

printf( "%d,%d ",max(3,5,56),max(6,0,4,32,45,533));

return 0;

}

///////////////////////////////////////////////

从main.c中的printf开始读这个函数。

首先看printf函数的定义:

1 static int printf(const char *fmt, ...)

2 {

3 va_list args;

4 int i;

5

6 va_start(args, fmt);

7 write(1,printbuf,i=vsprintf(printbuf, fmt, args));

8 va_end(args);

9 return i;

10 }

参数中明显采用了可变参数的定义,而在main.c函数的后面直接调用了printf函数,我们可以看下printf函数的参数是如何使用的。

1 printf("%d buffers = %d bytes buffer space\n\r",NR_BUFFERS,

2 NR_BUFFERS*BLOCK_SIZE);

3 printf("Free mem: %d bytes\n\r",memory_end-main_memory_start);

先来分析第一个printf调用:

printf("%d buffers = %d bytes buffer space\n\r",NR_BUFFERS, NR_BUFFERS*BLOCK_SIZE);

可以看到*fmt等于"%d buffers = %d bytes buffer space\n\r”,是一个char 类型的指针,指向字符串的启始位置。而可变的参数在这里是NR_BUFFERS和NR_BUFFERS*BLOCK_SIZE。

其中NR_BUFFERS在buffer.c中定义为缓冲区的页面大小,类型为int;BLOCK_SIZE在fs.h 中的定义为

#define BLOCK_SIZE 1024

因此两个可变参数NR_BUFFERS和NR_BUFFERS*BLOCK_SIZE都为int类型;

以前已经分析过可变参数的一系列实现函数va函数。

va_list arg_ptr;

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变量是指向参数的指针。然后使用va_start使arg_ptr指针指向prev_param的下一位,然后使用va_args取出从arg_ptr开始的type类型长度的数据,并返回这个数据,最后使用va_end结束可变参数的获取。

在printf("%d buffers = %d bytes buffer space\n\r",NR_BUFFERS, NR_BUFFERS*BLOCK_SIZE)中,根据以上的分析fmt指向字符串,args首先指向第一个可变参数,也就是NR_BUFFERS(args 在经过一次type va_arg( va_list arg_ptr, type )调用后,会根据type的长度自动增加,从而指向第二个可变参数NR_BUFFERS*BLOCK_SIZE)。

我们先不管write函数的实现,首先来看vsprint。

C语言输入输出函数printf与scanf的用法格式

C 语言输入输出函数printf 与scanf 的用法格式 printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入设备(键盘)上读数据。下面详细介绍这两个函数的用法。 一、printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式控制字符, 以"%"开始, 后跟一个或几个控制字符,用来确定输出内容格式。 参量表是需要输出的一系列参数,可以是常量、变量或表达式,其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。 例如: printf("a=%d b=%d",a,b); 1. 格式控制符Turbo C 2.0提供的格式化规定符如下: 格式控制字符 参量表 正常字符

━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e,%E 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %o 无符号以八进制表示的整数 %g,%G 自动选择合适的表示法 ━━━━━━━━━━━━━━━━━━━━━━━━━━ printf的附加格式说明字符 字符说明 l 用于长整型数或双精度实型,可加在格式 符d、o、x、u和f前面 m(代表一个正整数据最小输出显示宽度

6步教你在STM32程序中添加 printf函数

6步教你在STM32程序中添加printf函数 6步教你在STM32程序中添加printf函数 前提是你有一个完整的可以运行的keil工程比如ADC的 调试的时候很多时候用到串口这里教你怎么样使用Printf 函数 在程序中添加Printf.txt 1, #include 2, /* Private functions ---------------------------------------------------------*/ 下添加 void USART_Configuration(void); #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ 3,添加如下2个函数usart配置和重定向C库的printf函数 void USART_Configuration() { /* USARTx configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* Configure USART1 Tx (PA9) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA10) as input floating */

c语言printf()输出格式

c语言printf()输出格式大全 1.转换说明符 %a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99) %c 字符 %d 有符号十进制整数 %f 浮点数(包括float和doulbe) %e(%E) 浮点数指数输出[e-(E-)记数法] %g(%G) 浮点数不显无意义的零"0" %i 有符号十进制整数(与%d相同) %u 无符号十进制整数 %o 八进制整数 e.g. 0123 %x(%X) 十六进制整数() e.g. 0x1234 %p 指针 %s 字符串 %% "%" 2.标志 左对齐:"-" e.g. "%-20s" 右对齐:"+" e.g. "%+20s" 空格:若符号为正,则显示空格,负则显示"-" e.g. "% " #:对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x; 对e,g,f 类当结果有小数时才给出小数点。 3.格式字符串(格式) [标志][输出最少宽度][.精度][长度]类型 "%-md" :左对齐,若m比实际少时,按实际输出。 "%m.ns":输出m位,取字符串(左起)n位,左补空格,当n>m or m省略时m=n e.g. "%7.2s" 输入CHINA 输出" CH" "%m.nf":输出浮点数,m为宽度,n为小数点右边数位 e.g. "%" 输入3852.99 输出3853.0 长度:为h短整形量,l为长整形量 printf的格式控制的完整格式: % - .n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。

C中Printf函数的格式控制

printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。 ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。 --------------------------------------- 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。 %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 %ld:输出长整型数据。 ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。 例: main() { int a = -1; printf("%d, %o", a, a); } 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。 ③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。 ④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。 ⑤c格式:输出一个字符。 ⑥s格式:用来输出一个串。有几中用法 %s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。 %ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。 %-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。 %m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。 %-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。

C语言IO--printf右对齐补零

C语言IO--printf右对齐补零 关于printf的一点总结,内容来自https://www.doczj.com/doc/d912488867.html,/s/blog_5ac88b350100auna.html 1.1 标准输入输出函数 1.1.1 格式化输入输出函数 Turbo C2.0 标准库提供了两个控制台格式化输入、输出函数printf( ) 和 scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。 printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入 设备(键盘)上读数据。下面详细介绍这两个函数的用法。 一、printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原 样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出 参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想 不到的错误。 1. 格式化规定符 Turbo C2.0提供的格式化规定符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g 自动选择合适的表示法

C语言Printf之使用及在单片机中的用法

一、printf常用说明 printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。 ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。 ---------------------------------- 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。 %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 %ld:输出长整型数据。 ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。例: main() { int a = -1; printf("%d, %o", a, a); } 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。 ③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。 ④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。 ⑤c格式:输出一个字符。

C语言中printf格式

2009-05-03 10:55 Turbo C2.0 标准库提供了两个控制台格式化输入、输出函数printf( ) 和scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。 printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标 准输入设备(键盘)上读数据。下面详细介绍这两个函数的用法。 一、printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输 出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原 样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输 出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意 想不到的错误。 1. 格式化规定符 Turbo C2.0提供的格式化规定符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符 %p 指针的值 %e 指数形式的浮点数 %x, %X 无符号以十六进制表示的整数 %0 无符号以八进制表示的整数 %g 自动选择合适的表示法 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 说明: (1). 可以在"%"和字母之间插进数字表示最大场宽。 例如: %3d 表示输出3位整型数, 不够3位右对齐。 %9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。 %8s 表示输出8个字符的字符串, 不够8个字符右对齐。 如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。但对浮点数, 若整数部分位数超过了说明的整数位宽度, 将按实际整数位输出; 若小数部分位数超过了说明的小数位宽度, 则按说明的宽度以四舍五入输出。 另外, 若想在输出值前加一些0, 就应在场宽项前加个0。 例如: %04d 表示在输出一个小于4位的数值时, 将在前面补0使其总宽 度为4位。

C语言printf函数详解

功能: 产生格式化输出的函数。 用法: printf(格式控制字符串,参数1,参数2,…,参数n); 格式控制字符串定义为: %[flags][width][.perc][F|N|h|l]type type d有符号10进制整数 i有符号10进制整数 o无符号8进制整数 u无符号10进制整数 x无符号的16进制数字,并以小写abcdef表示 X无符号的16进制数字,并以大写ABCDEF表示 f浮点数 E/e用科学记数法表示浮点数 g用%f和%e表示中,总的位数最短的来表示浮点数。G同g格式,但表示为指数c单个字符 s字符串 S wchar_t字符(宽字符)类型字符串 %显示百分号本身 p显示一个指针,near指针表示为:XXXX,far指针表示为:XXXX:YYYY n相连参量应是一个指针,其中存放已写字符的个数 flags:规定输出格式 无右对齐,左边填充0和空格 -左对齐,右边填充空格 +在数字前增加符号+或- 0 将输出的前面补上0,直到占满指定列宽为止(不可以搭配使用-) 空格输出值为正时冠以空格,为负时冠以负号 #当type=c,s,d,i,u时没有影响;当type=o,x,X时,分别在数值前增加'0',"0x","0X"; 当type=e,E,f时,总是使用小数点;当type=g,G时,除了数值为0外总是显示小数点。 width:用于控制显示数值的宽度 n(n=1,2,3...)宽度至少为n位,不够以空格填充 0n(n=1,2,3...)宽度至少为n位,不够左边以0填充 *格式列表中,下一个参数还是width prec:用于控制小数点后面的位数 无按缺省精度显示 0当type=d,i,o,u,x时,没有影响;当type=e,E,f时,不显示小数点 n(n=1,2,3...)当type=e,E,f时,表示的最大小数位数

puts()函数和printf函数的区别

puts()函数和printf函数的区别 puts()函数只用来输出字符串,没有格式控制,里面的参数可以直接是字符串或者是存放字符串的字符数组名。 printf()函数的输出格式很多,可以根据不同格式加转义字符,达到格式化输出。 puts()函数的作用与语句printf("%s\n",s);的作用形同。 例子: ①: #include int main( void ) { puts( "Hello world from puts!" ); //字符串,最后隐含带有'\0'字符 } Output Hello world from puts! ②: main() { static char a[] = {'H','I','!','!'}; puts(a); } 则输出Hi!!烫烫烫烫烫烫烫烫烫烫烫烫dhaklhdwuhdaghdagdak... (后面都是乱码)

原因: a在结尾处缺少一个空字符('\0'), 所以它不是一个串,这样, puts() 就不知道什么时候停止输出, 它将会把 a 后面内存单元中的内容都打印出, 直到它在什么地方碰到了一个空字符为止。 ③: //============== cat hello.c #include int main(void) { printf("hello world!\n"); } //======================== gcc -S hello.c -o hello.s 生成汇编代码 //======================== cat hello.s //========================= .file "hello.c" .section .rodata .LC0: .string "hello world!" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx)

Printf格式

printf( )格式 printf()格式转换的一般形式如下 %(flags)(width)(.prec)type 以括号括起来的参数为选择性参数,而%与type则 是必要的。底下先介绍type的几种形式 %d 整数的参数会被转成一有符号的十进制数字 %u 整数的参数会被转成一无符号的十进制数字 %o 整数的参数会被转成一无符号的八进制数字 %x 整数的参数会被转成一无符号的十六进制数 字,并以小写abcdef表示 %X 整数的参数会被转成一无符号的十六进制数 字,并以大写ABCDEF表示浮点型数 %f double 型的参数会被转成十进制数字,并取到小 数点以下六位,四舍五入。 %e double型的参数以指数形式打印,有一个数字 会在小数点前,六位数字在小数点后,而在指数部 分会以小写的e来表示。 %E 与%e作用相同,唯一区别是指数部分将以大写 的E 来表示。 %g double 型的参数会自动选择以%f 或%e 的格式 来打印,其标准是根据欲打印的数值及所设置的有 效位数来决定。 %G 与%g 作用相同,唯一区别在以指数形态打印时 会选择%E 格式。 字符及字符串 %c 整型数的参数会被转成unsigned char型打印出。 %s 指向字符串的参数会被逐字输出,直到出现 NULL字符为止 %p 如果是参数是“void*”型指针则使用十六进制 格式显示。 prec 有几种情况 1. 正整数的最小位数。 2. 在浮点型数中代表小数位数 3. 在%g 格式代表有效位数的最大值。 4. 在%s格式代表字符串的最大长度。 5. 若为*符号则代表下个参数值为最大长度。 width为参数的最小长度,若此栏并非数值,而是*

C语言的printf输出格式

C语言的printf输出格式控制 printf大家都耳熟能详,但是能真正将其用法弄透的估计很少见。 转一篇,改天整理。 1.转换说明符 %a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99) %c 字符 %d 有符号十进制整数 %f 浮点数(包括float和doulbe) %e(%E) 浮点数指数输出[e-(E-)记数法] %g(%G) 浮点数不显无意义的零"0" %i 有符号十进制整数(与%d相同) %u 无符号十进制整数 %o 八进制整数 %x(%X) 十六进制整数0f(0F) e.g. 0x1234 %p 指针 %s 字符串 %% 输出字符% 2.标志 左对齐:"-" 比如:"%-20s" 右对齐:"+" 比如:"%+20s" 空格:若符号为正,则显示空格,负则显示"-" 比如:"% 6.2f" #:对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点。 printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。未指定n时,隐含的精度为n=6位。 ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。 格式字符 格式字符用以指定输出项的数据类型和输出格式。

printf 函数中的格式转化字符及其含义

printf 函数中的格式转化字符及其含义 另外,可以在格式转换字符和%之间插入一些辅助的格式控制字符。因此,格式控制字符的一般格式为: %[flag][width][.precision][size]Type 有符号整数的输出 输出有符号整数的格式控制符的一般形式为: %[-][+][0][width][.precision][l][h]d 其中各控制符的说明如下: ?-:表示输出的数据左对齐,默认时是右对齐。 ?+:输出正数时,在数的前面加上+号。

?0:右对齐时,如果实际宽度小于width,则在右边的空位补0。 ?width:无符号整数,表示输出整数的最小宽度。若实际宽度大于width,则按照实际宽度输出。 ?precision:无符号整数,表示至少要输出precision位。若整数的位数大于precision,则按照实际的位数输出,否则在左边的空位 上补0。 ?l:输出长整形数据 ?h:输出短整形数据 无符号整数的输出 输出无符号整数的格式控制符的一般形式为: %[-][#][0][width][.precision][l][h]u|o|x|X 其中各控制符的说明如下: ?#:当以八进制形式输出数据(%o)时,在数字前输出0;当以十六进制形式输出数据(%x或%X)时,在数字前输出0x或0X。 ?precision:与前面介绍的相同,但要注意八进制数字前的0和十六进制前的0x或0X同样占位数。 ?其他字段与前面介绍的相同。

小结: 实数的输出 输出实数的格式控制符的一般形式为: %[-][+][#][0][width][.precision][l|L]f|e|E|g|G 其中各控制符的说明如下: ?#:必须输出小数点。 ?precision:规定输出实数时,小数部分的位数。 ?l:输出double型数据(默认也是输出double型数据)。 ?L:输出long double型数据。 ?其他字段的含义与前面介绍的相同。 字符和字符串的输出

printf格式化输出详解

printf()格式化输出详解 2009年03月28日星期六 13:39 本文来自:https://www.doczj.com/doc/d912488867.html,/language/20080420/7060.html printf的格式控制的完整格式: % - 0 m.n l或h 格式字符 下面对组成格式说明的各项加以说明: ①%:表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。对数值型的来说,未指定n时,隐含的精度为n=6位。 ⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。 --------------------------------------- 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d:按整型数据的实际长度输出。 %md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。 %ld:输出长整型数据。 ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。 例: main() { int a = -1; printf("%d, %o", a, a); } 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。 ③x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。 ④u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。 ⑤c格式:输出一个字符。 ⑥s格式:用来输出一个串。有几中用法 %s:例如:printf("%s", "CHINA")输出"CHINA"字符串(不包括双引号)。

单片机中printf函数的运用

51中printf使用注意 C51标准串口发送程序(已C8051F120为例,注意C8051F120特殊功能寄存器是分页的) /*********************************************************** 函数名称:send_char_com 函数功能:向串口发送一字节字符 入口参数:unsigned char sendByte 一个字节字符(8 bit) 出口参数:无 备注: ***********************************************************/ void send_char_com(unsigned char sendByte) { char SFRPAGE_SA VE = SFRPAGE; //用到TI0(SCON0.1)SFR页:0 SFRPAGE = UART0_PAGE; SBUF0=sendByte; while (TI0== 0); //等待发送完毕 TI0= 0; //清发送中断标志TI0 SFRPAGE = SFRPAGE_SA VE; } /*********************************************************** 函数名称:send_char_com 函数功能:向串口发送一个字符串 入口参数:unsigned char *str 字符串数组首地址 unsigned int strlen 该字符串长度 出口参数:无 备注: ***********************************************************/ void send_string_com( unsigned char *str, unsigned int strlen) { unsigned int k= 0 ; do { send_char_com(*(str + k)); k++; } while (k < strlen); } 在C51中直接使用printf比自己编个串口发送字符串的函数方便,但有几个问题要注意的。 1. 使用printf之前要先包含stdio.h这个头文件 #include 具体stdio.h包含的函数见下面网址 https://www.doczj.com/doc/d912488867.html,/support/man/docs/c51/c51_stdio_h.htm 2.

C语言图形输出习题

【4.4】输入n值,输出如图所示矩形。 【4.5】输入n值,输出如图所示平行四边形。 【4.6】输入n值,输出如图所示高为n的等腰三角形。 【4.7】输入n值,输出如图所示高为n的等腰三角形。 【4.8】输入n值,输出如图所示高和上底均为n的等腰梯形。

【4.9】输入n值,输出如图所示高和上底均为n的等腰空心梯形。 【4.10】输入n值,输出如图所示边长为n的空心正六边型。 【4.11】输入n值,输出如图所示图形。 【4.12】输入n值,输出如图所示图形。 【4.13】输入n值,输出如图所示图形。

【4.14】输入n值,输出如图所示图形。 【4.15】输入n值,输出如图所示图形。 【4.16】输入n值,输出如图所示图形。(例为n=6时) 【4.17】编写程序,输出如图所示sin(x) 函数0到2π的图形。

【4.18】编写程序,在屏幕上输出一个由*号围成的空心圆。 【4.19】编写程序,在屏幕上绘制如图余弦曲线和直线。若屏幕的横向为x轴,纵向为y轴,在屏幕上显示0~360度的cos(x)曲线与直线x=f(y)=45*(y-1)+31的迭加图形。其中cos图形用"*"表示,f(y)用"+"表示,在两个图形的交点处则用f(y)图形的符号。

【4.20】编写程序,输出如图所示高度为n的图形。 【4.21】编写程序,输出如图所示高度为n的图形。 【4.22】输入n值,输出如图所示图形。

【4.23】输入n值,输出如图所示的n×n(n<10)阶螺旋方阵。 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 图4.19 n=5时的螺旋方阵 【4.24】输入n值,输出如图所示回型方阵。 【4.25】输出如图所示的数字金字塔

printf用法---printf输出固定长度的字符

printf用法---printf输出固定长度的字符 需要打印一个固定长度的字符 一般可以这么做: void str_print(const char* str, unsigned int str_len) { int i=0; for (; i < str_len; i++) printf("%c", str[i]); printf("\n"); } 但是用一行代码也可以搞定: printf("%.*s\n", str_len, str); printf一般用法:

ref : https://www.doczj.com/doc/d912488867.html,/yuaqua/archive/2011/10/21/2219856.ht ml 小数点.后“*”表示输出位数,具体的数据来自参数表 printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个“*”代替那个常量,然后在后面提供变量给“*”。 同样,小数点.前也可以添加*,也要用户输入一个位宽值来代替,表示输出的字符所占位宽。 #include <cstdio> #include <iostream> int main() { char *s = "this is test example"; int a,b; printf("%.*s\n", 10, s);//这里的常量10就是给*号的,你也可以用一个变量来控制宽度

printf("%*.*s\n", 20, 10, s);//常量20控制输出所占位宽,也可以用一个变量控制 std::cin>>a>>b; //输入15 10 printf("%*.*s\n", a, b, s);//输出为:-----this is te std::cin.get(); std::cin.ignore();//暂停程序执行 } 输出结果为: this is te ----------this is te//-代表空格 15 10 //输入 -----this is te注:printf的一般形式为printf("格式控制字符串",输出列表),格式控制字符串形式为:[标志][输出最小宽度][.精度][长度]类型。 其中方括号[]中的项为可选项。各项的意义介绍如下:1)类型:类型字符用以表示输出数据的类型,其格式符和意义如下表所示: d 以十进制形式输出带符号整数(正数不输出符号)

printf函数

在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减,一些黑客就是在堆栈中修改函数返回地址,执行自己的代码来达到执行自己插入的代码段的目的. 总之,函数在堆栈中的分布情况是:地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段. 堆栈中,各个函数的分布情况是倒序的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的分布情况如下: 最后一个参数 倒数第二个参数 ... 第一个参数 函数返回地址 函数代码段 static int printf(const char *fmt,...) { va_list args; int i; va_start(args,fmt); write(1,printfbuf,i=vsprintf(printbuf,fmt,args)); va_end(args); return i; } 1、#include 头文件 2、const char *fmt const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性. fmt为可变参数的前一个参数。控制字符串写入%d,%f的地方 70 va_start(args,fmt)是为了使fmt指向第一个可选参数 void va_start(va_list ap, last) va_start必须第一个调用,它初始化va_list类型的变量ap,使ap指向第一个可选参数。参数last 是可变参数列表(即函数原型中的省略号…)的前一个参数的名字,也就是最后类型已确定的函数参数名。因为这个参数的地址将会被宏va_start用到,所以最好不要是寄存器变量,函数,或者数组。 va_end(args)结束可变参数的获取

C语言格式输出函数printf

C语言格式输出函数printf()详解标题 4.1.1printf函数(格式输出函数) printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。 1.printf函数调用的一般形式 printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用printf函数之前必须包含stdio.h文件。printf函数调用的一般形式为: printf(“格式控制字符串”,输出表列) 其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如: “%d”表示按十进制整型输出; “%ld”表示按十进制长整型输出; “%c”表示按字符型输出等。 非格式字符串在输出时原样照印,在显示中起提示作用。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。 【例4.3】 main() { int a=88,b=89; printf("%d %d\n",a,b); printf("%d,%d\n",a,b); printf("%c,%c\n",a,b); printf("a=%d,b=%d",a,b); } 本例中四次输出了a,b的值,但由于格式控制串不同,输出的结果也不相同。第四行的输出语句格式

控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a,b值之间有一个空格。第五行的printf语句格式控制串中加入的是非格式字符逗号,因此输出 的a,b值之间加了一个逗号。第六行的格式串要求按字符型输出a,b值。第七行中为了提示输出结果又增加了非格式字符串。 2.格式字符串 在Turbo C中格式字符串的一般形式为: [标志][输出最小宽度][.精度][长度]类型。其中方括号[]中的项为可选项。 各项的意义介绍如下: 1.类型:类型字符用以表示输出数据的类型,其格式符和意义如下表所示:

C语言Printf和Scan函数的使用方法

C语言Printf和Scan函数的使用方法 一printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想 不到的错误。 格式化字符串的格式是: %[标志][输出最小宽度][.精度][长度]格式字符 1. 标志:标志字符为-、+、#、空格四种,其意义下表所示: 标志意义 - 结果左对齐,右边填空格 + 输出符号(正号或负号) 空格输出值为正时冠以空格,为负时冠以负号 # 对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点(??????) 例1: #include main() { int a=100; float b=123.255; printf("a=%d ",a); printf("a=%10d ",a); printf("a=%-10d ",a); printf("a=%+d ",a); printf("a=% d ",a); printf("a=%#o ",a); printf("a=%#x ",a); printf("b=%#f ",b); } 运行结果 a=100

c语言printf()输出格式大全

c 语言printf() 输出格式大全 1 ?转换说明符 " e.g. "% 6.2f" # :对c,s,d,u 类无影响;对o 类,在输出时加前缀o ;对x 类, 在输出时 加前缀Ox ; 对e,g,f 类当结果有小数时才给出小数点。 3.格式字符串(格式) [标志][输出最少宽度][.精度][长度]类型 "%-md":左对齐,若m 比实际少时,按实际输出。 "%m.ns":输出m 位,取字符串(左起)n 位,左补空格,当n>m or m 省略时m=n e.g. "%7.2s" 输 %a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99) %c 字符 %d 有符号十进制整数 %f 浮点数(包括float 和 doulbe) %e(%E) 浮点数指数输出[e-(E-)记数法] %g(%G) 浮点数不显无意义的零"0" %i 有符号十进制整数 (与%d 相同) %u 无符号十进制整数 %o 八进制整 g. 0123 %x(%X) 十六进制整数0f(0F) e.g. 0x1234 %p 指针 %s 字符串 %% "%" 左对齐: "-" e.g. "%-20s" 右对齐: "+" e.g. "%+20s" 2.标志

入CHINA CH" 输出 %m.nf":输出浮点数,m为宽度,n为小数点右边数位 e.g. "%3.1f" 输入3852.99 输出3853.0 长度:为h短整形量,1为长整形量 printf的格式控制的完整格式: % - 0 m.n I或h格式字符 下面对组成格式说明的各项加以说明: ①%表示格式说明的起始符号,不可缺少。 ②-:有-表示左对齐输出,如省略表示右对齐输出。 ③0:有0表示指定空位填0,如省略表示指定空位不填。 ④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。 ⑤I或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。 格式字符 格式字符用以指定输出项的数据类型和输出格式。 ①d格式:用来输出十进制整数。有以下几种用法: %d按整型数据的实际长度输出。 %md m为指定的输出字段的宽度。如果数据的位数小于m贝U左端补以空格,若大于m则按实际位数输出。 %ld:输出长整型数据。 ②o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%m”格式输出。 例: mai n() { int a = -1;

printf函数中常用的格式说明

3.2.2 printf函数中常用的格式说明 格式控制中,每个格式说明都必须用“%”开头,以一个格式字符作为结束,在此之间可以根据需要插入“宽度说明”、左对齐符号“-”、前导零符号“0"等。 1.格式字符 %后允许使用的格式字符和它们的功能如表3.1所示。在某些系统中,可能不允许使用大写字母的格式字符,因此为了使程序具有通用性,在写程序时应尽量不用大写字母的格式字符。 2.长度修饰符 在%和格式字符之间,可以加入长度修饰符,以保证数据输出格式的正确和对齐。对于长整型数(long)应该加l,即%ld;对于短整型数(short)可以加h,即%hd。 3.输出数据所占的宽度说明 当使用%d,%c,%f,%e,%s,…的格式说明时,输出数据所占的宽度(域宽)由系统决定,通常按照数据本身的实际宽度输出,前后不加空格,并采用右对齐的形式。也可以用以下三种方法人为控制输出数据所占的宽度(域宽),按照使用者的意愿进行输出。 (1)在%和格式字符之间插入一个整数常数来指定输出的宽度n(例如%4d,n代表整数4)。如果指定的宽度n不够,输出时将会自动突破,保证数据完整输出。如果指定的宽度n超过

输出数据的实际宽度,输出时将会右对齐,左边补以空格,达到指定的宽度。 (2)对于float和double类型的实数,可以用“n1.n2”的形式来指定输出宽度(n1和n2分别代表一个整常数),其中n1指定输出数据的宽度(包括小数点),n2指定小数点后小数位的位数,n2也称为精度(例如%12.4f,n1代表整数12 ,n2代表整数4)。 对于f,e或E,当输出数据的小数位多于n2位时,截去右边多余的小数,并对截去部分的第一位小数做四舍五入处理;当输出数据的小数位少于n2时,在小数的最右边补0,使得输出数据的小数部分宽度为n2。若给出的总宽度n1小于n2加上整数位数和小数点(e或E 格式还要加上指数的5位),则自动突破n1的限制;反之,数字右对齐,左边补空格。 也可以用“.n2”格式(例如%.6f),不指定总宽度,仅指定小数部分的输出位数,由系统自动突破,按照实际宽度输出。如果指定“n1.0”或“.0”格式(例如%12.0f或%.0f),则不输出小数点和小数部分。 对于g或G,宽度用来指定输出的有效数字位数。若宽度超过数字的有效数字位数,则左边自动补0;若宽度不足,则自动突破。不指定宽度,将自动按照b位有效数字输出,截去右边多余的小数,并对截去部分的第一位小数做四舍五入处理。 (3)对于整型数,若输出格式是“0n1”或“.n2”格式(例如%05d或%.5d},则如果指定的宽度超过输出数据的实际宽度,输出时将会右对齐,左边补0。 对于float和double类型的实数,若用“0n1”或“n2”格式输出(例如%012.4f),如果给出的总宽度n1大于n2加上整数位数和小数点(e或E格式还要加上指数的5位),则数字右对齐,左边补0。 对于字符串,格式“n1”指定字符串的输出宽度,若n1小于字符串的实际长度,则自动突破,输出整个字符串;若n1大于字符串的实际长度,则右对齐,左边补空格。若用“.n2”格式指定字符串的输出宽度,则若n2小于字符串的实际长度,将只输出字符串的前n2个字符。 注意:输出数据的实际精度并不完全取决于格式控制中的域宽和小数的域宽,而是取决于数据在计算机内的存储精度。通常系统只能保证float类型有7位有效数字,double类型有15位有效数字。若你指定的域宽和小数的域宽超过相应类型数据的有效数字,输出的多余数字是没有意义的,只是系统用来填充域宽而已。 4.输出数据左对齐 通常输出数据都隐含右对齐,如果想左对齐,可以在格式控制中的“%”和宽度之间加一个“-”号来实现。 5.使输出数据总带+号或-号 通常输出的数据如果是负数,前面有符号“-”,但正数前面的“+”一般都省略了。如果要每一个数前面都带正负号,可以在“%”和格式字符间加一个“+”号来实现。 表3.2列举了各种输出宽度和不指定宽度情况下的输出结果(表中输出结果中时符号j 代表一个空格),其中k为int型,值为1234;f为float型,值为123.456。

相关主题
文本预览
相关文档 最新文档