黑马程序员--C语言基础之--printf函数

------- IOS培训期待与您交流! ----------

上一篇介绍了C语言中scanf函数的用法,接下来让我们来进一步地认识了解一下printf函数。

一、printf函数的用法:

  首先让我们来看一下其定义的格式:

int printf(const char *format,[argument])

 (一)、一般格式

  printf(格式控制,输出表列); 如:

  

printf("i=%d,ch=%c/n",i,ch);

说明:

(1)、“格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括两种信息:

  ①格式说明:由“%”和格式字符组成,它的作用是将输出的数据转换为指定的格式输出。

  ②普通字符,即需要原样输出的字符。

(2)、“输出表列”是需要输出的一些数据,可以是表达式

(3)、printf函数的一般形式可以表示为:printf(参数1,参数2,……,参数n),其功能是将参数2~参数n按参数1给定的格式输出。

(二)、格式字符(9种)

(1)、d(或i)格式符。用来输出十进制整数,有以下几种用法:

 ①%d,按整型数据的实际长度输出。

 ②%md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。

 ③%ld(%mld 也可),输出长整型数据。

 例如:

long a=123456;  

printf("%ld",a);

(2)、o格式符,以八进制数形式输出整数。格式:%o,%mo,%lo,%mlo都可。

(3)、x(或X)格式符,以十六进制数形式输出整数。格式:%x,%mx,%lx,%mlx都可。

(4)、u格式符,用来输出unsigned型数据,即无符号数,以十进制数形式输出。格式:%u,%mu,%lu都可。

(5)、c格式符,用来输出一个字符。格式:%c,%mc都可。

(6)、s格式符,用来输出一个字符串。格式:%s,%ms,%-ms,%m.ns,%-m.ns都可。

(7)、f格式符,用来输出实数(包括单、双精度),以小数形式输出。格式:%f,%m.nf,%-m.nf都可。(注意:单精度实数的有效位数一般为7位,双精度为16位。)

(8)、e(或E)格式符,以指数形式输出实数。格式:%e,%m.ne,%-m.ne都可。

(9)、g(或G)格式符,用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种)。

(三)、说明

(1)、除了X、E、G(用大写字母表示)外,其他格式字符必须用小写字母;

(2)、“格式控制”字符串内可以包含转义字符;

(3)、如果想输出字符“%”,则应该在“格式控制”字符串中用连续两个%表示,如:

  printf("%f%%",1.0/3);

(4)、printf函数常见格式字符表参见下表

格式字符 说 明
d,i  以带符号的十进制形式输出整数(正数不输出符号)
以八进制无符号形式输出整数(不输出前导符0)
x,X 以十六进制无符号形式输出整数(不输出前导符0x),用x则输出十六进制数的a~f时以小写形式输出,用X时,则以大写字母输出
u 以无符号十进制形式输出整数
c 以字符形式输出,只输出一个字符
s 输出字符串
f 以小数形式输出单、双精度数,隐含输出6位小数
e,E 以指数形式输出实数
g,G 选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0

二、程序例 

/*  程序1  */
#include <stdio.h>  
int main(){

  printf("Hello,world/n");
  
  while(1);
  
}

/*  程序2  */  
#include<stdio.h>
int main(){

  int i = 1, j =2;
  
  printf("%d %d/n",i,j);
  
  while(1);
  
}

三、printf 命令

  printf 命令转换、格式化并写 Argument 参数到标准输出。Argument 参数是由 Format 参数控制格式化的。格式化输出行不能超出 LINE_MAX 字节长度。

  下列环境变量影响 printf 命令的执行:

  LANG 在 LC_ALL 和相应的环境变量(以 LC_ 开头)没有指定语言环境时,确定语言环境编目使用的语言环境。

  LC_ALL 确定用于覆盖由 LANG 或其它任何 LC_ 环境变量设置的任何语言环境编目值的语言环境。

  LC_CTYPE 确定把文本字节数据顺序解释为字符的语言环境;例如,单一字节对应多字节字符的参数。

  LC_MESSAGES 确定写消息使用的语言。

  LC_NUMERIC 确定数字格式编排的语言环境。此环境变量影响使用 e、E、f、g 和 G 转换字符编写的数字的格式。

  Format 参数是包含三种对象类型的一个字符串:

  * 无格式字符复制到输出流。

  * 转换规范,每个规范导致在值参数列表中检索 0 个或更多个项。

  * 以下转义序列。在复制到输出流时,这些序列导致它们的相关操作在有此功能的设备上显示:

  // 反斜杠

  /a 警告

  /b 退格

  /f 换页

  /n 换行

  /r 回车

  /t 跳格

  /v 垂直跳格

  /ddd ddd 是 1、2 或 3 位八进制数字。这些转义序列作为由八进制数指定的具有数字值的字节显示。

  Argument 参数是一个或多个字符串的列表,它在 Format 参数的控制下被写到标准输出。

  Format 参数在必要的情况下会经常重新使用以满足 Argument 参数。将好像提供了空字符串 Argument 一样评估任何额外的 c 或者 s 转换规范;其它额外转换规范将好像提供了 0 Argument 一样评估。此处 Format 参数不包含转换规范仅出现 Argument 参数,结果是不确定的。

  每个 Format 参数中的转换规范都具有如下顺序的语法:

  1. % (百分号)。

  2. 零或更多的选项,修改转换规范的含义。选项字符和它们的含义是:

  - 转换结果在字段中左对齐。

  + 符号转换结果常以符号(+ 或者 -)开始。

  空格 如果符号转换的第一个字符不是符号,结果的前缀将是空格。如果空格和 + 选项字符都显示,则忽略空格选项字符。

  # 此选项指定值转换到备用格式。对于 c、d、i, u 和 s 转换,选项没有作用。对于 o 转换,它增加精度来强制结果的第一数字是 a、0(零)。对于 x 和 X 转换,非零结果分别具有 0x 或 0X 前缀。对于 e、E、 f、g 和 G 转换,结果通常包含基数字符,即使基数字符后没有数字。对于 g 和 G 转换,结尾零不象通常一样除去。

  0 对于 d、i、o、 u、x、e、 E、f、g 和 G 转换,前导零(跟在符号或底数的后面)用于填充字段宽度,将不用空格填充。如果显示 0(零)和 -(减号)选项,0(零)选项被忽略。对于 d、i、o、u、x 和 X 转换,如果指定精度,0(零)选项将被忽略。

  注:

  其它转换,没有定义其行为。

  3. 可选的指定最小值字段宽度的十进制数字字符串。如果转换值字符少于字段宽度,该字段将从左到右按指定的字段宽度填充。如果指定了左边调整选项,字段将在右 边填充。如果转换结果宽于字段宽度,将扩展该字段以包含转换后的结果。不会发生截断。然而,小的精度可能导致在右边发生截断。

  4. 可选的精度。精度是一个 .(点)后跟十进制数字字符串。如果没有给出精度,按 0(零)对待。精度指定:

  * d、o、i、 u、x 或 X 转换的最少数字显示位数。

  * e 和 f 转换的基数字符后的最少数字显示位数。

  * g 转换的最大有效数字位数。

  * s 转换中字符串的最大打印字节数目。

  5. 指示要应用的转换类型的一个字符,例如:

  % 不进行转换。打印一个 %(百分号)。

  d, i 接受整数值并将它转换为有符号的十进制符号表示法。精度指定显示的最小数字位数。如果值转换后可以用更少的位数来表示,将使用前导零扩展。缺省精度是 1。精度为零的零值转换的结果是空字符串。用零作为前导字符来指定字段宽度,导致用前导零填充字段宽度值。

  o 接受整数值并将它转换为有符号的八进制符号表示法。精度指定显示的最小数字位数。如果值转换后可以用更少的位数来表示,将使用前导零扩展。缺省精度是 1。精度为零的零值转换的结果是空字符串。用零作为前导字符来指定字段宽度,导致用前导零填充字段宽度值。不用八进制值表示字段宽度。

  u 接受整数值并将它转换为无符号的十进制符号表示法。精度指定显示的最小数字位数。如果值转换后可以用更少的位数来表示,将使用前导零扩展。缺省精度是 1。精度为零的零值转换的结果是空字符串。用零作为前导字符来指定字段宽度,导致用前导零填充字段宽度值。

  x, X 接受整数值并将它转换为十六进制符号表示法。字母 abcdef 用于 x 转换,字母 ABCDEF 用于 X 转换。精度指定显示的最小数字位数。如果值转换后可以用更少的位数来表示,将使用前导零扩展。缺省精度是 1。精度为零的零值转换的结果是空字符串。用零作为前导字符来指定字段宽度,导致用前导零填充字段宽度值。

  f 接受浮点或者双精度值并将它转换为十进制符号表示法,格式为 [-] ddd.ddd。基数字符(在这里显示为十进制点)后的数字位数等于规定的精度。 LC_NUMERIC 语言环境编目确定在这个格式中使用的基数字符。如果不指定精度,则输出六个数字。如果精度是 0(零),将不显示基数字符。

  e, E 接受浮点或者双精度值并将它转换为指数表示的形式 [-] d.dde{+|-}dd。在基数字符前有一个数字(在这里显示为十进制点),基数字符后的数字位数等于规定的精度。 LC_NUMERIC 语言环境编目确定在这个格式中使用的基数字符。如果不指定精度,则输出六个数字。如果精度是 0(零),将不显示基数字符。E 转换字符在指数前生成带 E 而不是带 e 的数字。指数通常至少包含两个数字。然而,如果要打印的指数值大于两个数字,必要时需要打印附加指数数字。

  g、G 接受浮点和双精度值并转换为 f 或 e 转换字符的样式(或在 G 转换的情况下是 E),用精度指定有效数字的个数。尾零将从结果中除去。基数字符只有在其后是数字时显示。使用的样式取决于转换的值。样式 g 仅在转换的指数结果小于 -4,或大于或等于精度时使用。

  c 接受值将其作为字符串并打印字符串中的第一个字符。

  s 接受值将其作为字符串并打印字符串中的字符直到字符串结束或者达到精度指示的字符个数。如果没有指定精度,打印全部字符直到出现第一个空字符。

  b 接受值将其作为字符串,可能包含反斜杠转义序列。打印来自转换字符串的字节直到字符串结束或者达到精度规范指示的字节数。如果没有指定精度,打印全部字节直到出现第一个空字符。

  支持下列反斜杠转义序列:

  * 先前列出的反斜杠转义序列在 Format 参数描述下。这些转义序列将被转换到它们表示的单个字符。

  * /c(反斜杠 c)序列,它不显示并使 printf 命令忽略 Format 参数中的字符串参数包含的剩余的所有字符串,所有剩余的字符串参数和所有附加字符。

  退出状态

  该命令返回以下出口值:

  0 成功完成。

  >0 发生错误。

时间: 2024-08-06 04:55:40

黑马程序员--C语言基础之--printf函数的相关文章

黑马程序员--C语言基础之--scanf函数

------- IOS培训期待与您交流! ---------- 写代码的时候,我们可以看得出,几乎每一个C程序都会包括输入输出.输入输出是程序中最基本的操作之一.C语言本身并不提供输入输出的语句,输入输出操作是由C标准函数库中的函数来实现的.今天就先说说输入:scanf函数. scanf函数与printf函数一样,都不是C语言的关键字,而只是函数库的名字,它们被定义在stdio.h里,因此在使用scanf函数时要加 上#include<stdio.h>.它是格式输入函数,即按用户指定的格式从键

黑马程序员-c语言基础:各种数据类型的输出占位符

c语言中的输出操作相对java来说是比较麻烦的,每种数据类型的输出都有各自的占位符: 下面是各种数据类型的输出占位符: short/int : %d int a = 1; printf("这个整数是:%d", a); long: %ld; (long 是int得修饰,不能算是一种单独的数据类型,只是比int多了四个字节的存储空间) long long: %lld char : %c float/double : %f  float默认是6位小数输出:可以在%f中控制:例如:%.2f:输

黑马程序员-C语言基础:数组和字符串

数组:数组的定义注意点 数组初始化正确写法: int args[5] = {1,23,32,4,5}; int args[5] = {12,23}; int args[5] = {[3]=23, [4]=13};//这种写法也可以,直接给其中角标为3和4的赋值 int args[] = {12,23,32};//中括号中没写数组大小,在大括号中一定要写具体数值 int args['A'] = {2,34,5}; 错误写法: int args[];//这样编译器不知道给你开辟多大的内存空间 int

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比

黑马程序员_01_Java语言基础部分(数据类型与表达式、流程控制语句、数组与方法)

------- android培训.java培训.期待与您交流! ---------- Java语言主要由5中符号组成 标识符:数字.字母.美元符.下划线(注意不能数字开头) 关键字:goto和const保留了它们,但是Java没有使用. 运算符:注意运算符优先级(左结合和右结合要注意) 分隔符:注意+号可以分割字符串. 注释:三种注释. 数据类型与变量 常量: 整型 浮点型 字符:注意后面跟三个八进制(\ddd)和 四位unicode码(\u8bf7) (不区分大小写) 字符串 布尔型 变量:

黑马程序员---C语言基础---结构体

------iOS培训.Java培训.Android培训, iOS学习型技术博客,期待与您交流------ C语言基础---结构体 一.什么是结构体 介绍结构体之前,我想先简单介绍下数组.我想大家对数组都再熟悉不过了,顾名思义,数组就是将一些数据(元素)组合在一起,作为一个整体.使用数组需要注意的是这些元素必须是相同类型.而结构体和数组类似,也是将一些数据组合在一起作为一个整体,但是这些元素可以是不同类型.可以这么理解:结构体是更加灵活的数组,因为它允许元素是不同的类型. 实际生活中,如果我们要

黑马程序员——c语言基础语法(二)

指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值.未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机.指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则将引起错误.在C语言中,变量的地址是由编译系统分配的,对用户完全透明,用户不知道变量的具体地址. 两个有关的运算符: &:取地址运算符. *:指针运算符(或称“间接访问” 运算符). C语言中提供了地址运算符&来表示变量的地址.其一般形式为:&变量名: 如&a表示变量a的地址,&b表示

黑马程序员——c语言基础语法

1.变量名与变量值 变量名实际上是一个符号地址.程序编译时,系统给变量开辟该变量对应类型所需的内存空间(用于存储变量值),然后由系统建立一个从变量名到该内存空间的首地址的映射,这样就可以通过变量名访问到变量值了.  变量名由数字.字母和下划线组成.大小写敏感,不能以数字开头.变量名的长度(字符个数)没有硬性的规定,只是不同的C编译器可能会有不同要求.不过这应该不是大家要考虑的问题, 相信没有人会写那么长的变量名才对 C语言中,使用变量之前必须定义该变量,否则编译出错.定义变量时须写明变量所属类型

黑马程序员— C语言基础之内存剖析

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 在学习C语言基础知识时,老师对内存的分析很重视,几乎每个知识点都会帮我们分析内存存储情况,透过内存的分析也让我们对C语言有了更深的一些了解,C语言跟其他计算机语言相比,对内存的分析和要求更高,下面我们一起来了解和学习一下C语言的内存剖析,是我个人的在学习中的一些总结,如果问题或者不到位的地方也希望大家能够一起交流和指正. 第一讲  进制 进制是一种计数的方式,数值的表示形式,一般我们C语言主要