目录

1. printf函数

1.1 基本格式

1.2 格式字符串详解

1.2.1 普通字符

1.2.2 转换说明(conversion specification)

1.3 使用注意事项

2. scanf函数

2.1 基本格式

2.2 scanf函数工作方式

2.2.1 工作流程

2.2.2 如何识别数

2.2.3 如何处理普通字符

2.3 使用注意事项


1. printf函数

1.1 基本格式

格式:

printf(格式字符串, 表达式1, 表达式2, ...);

作用:显示格式字符串(format string)的内容,并在该串中的指定位置插入可能的值,其中值的类型可以是,

① 常量(e.g. 10)

② 变量(e.g. a)

③ 表达式(e.g. a + b)

1.2 格式字符串详解

示例:

printf("a = %d\n", a);

1.2.1 普通字符

普通字符原样输出

说明:转义字符

转义字符(escape sequence)包括非打印的控制字符和对编译器有特殊含义的字符(e.g. "(字符串界定符),'(字符界定符)和\(转义序列开始))

如要输出%字符,需要使用%%

printf("%d%%\n", a)

1.2.2 转换说明(conversion specification)

转换说明为要输出的内置占位

转换说明格式:

%m.pX 或 %-m.pXm,p:整型常量,如无p则小数点也不需要写
X:字母
-:左对齐,默认为右对齐

① m:最小字段宽度(minimum field width),指定要显示的最少字符数量

如果m > 实际要显示的内容,以空格补充,例如

printf("%4d", 12);

如果m < 实际要显示的内容,按需要长度显示,不截断,例如

pirntf("%3d", 1234);

② X:转换说明符(conversion specifier),指定了把数值从内部形式(二进制)转换成打印形式(字符串)的方法

printf 函数的本质就是把二进制数据转换成指定的字符串

③ p:精度(precision),其含义取决于转换说明符X

X转换说明符

p的含义

d:十进制形式的整数

待显示数字最少个数(必要时在数前补0),如省略默认值为1

示例:printf("%5.3d", 4);

e:指数形式的浮点数

小数点后应该出现的数字个数,默认为6,如p为0则不显示小数点

f:定点十进制形式的浮点数

与e相同

转换说明符补充说明:

① %i也可用于输出整数,但在scanf中,%i可匹配八进制(以0开头)、十六进制(以0x开头)和十进制的数(即匹配各种进制的整数),而%d只能匹配十进制

② %g是选择%e和%f 中字符串较短的方式输出。

1.3 使用注意事项

① C语言编译器不检查格式串中转换说明的数量是否和输出项数量相匹配

printf("%d %d\n", i); // 第2个显示无意义的值
printf("%d\n", i, j); // j的值不显示

② C语言编译器不检查转换说明是否适合要显示项的数据类型

int i= 10;
float f = (float)10.0;
printf("%d %f\n", f, i); //无意义输出
// 输出结果:0.000000 1076101120

注:这种使用会有警告

本质:对二进制数据的解释形式有误

2. scanf函数

2.1 基本格式

作用:根据特定的格式读取输入

本质:scanf是一种模式匹配函数,试图把输入的字符串与转换说明相匹配,即把读到的字符串解释成指定的二进制形式(与printf 函数正好相反)

示例:

scanf("%d /%d", &a, &b); // 其中%d为转换说明,/以及之前的空格为普通字符

2.2 scanf函数工作方式

2.2.1 工作流程

对于格式串中的每一个转换说明。scanf函数从输入的数据中①定位适当类型的项并且②在必要时跳过空格。然后scanf函数读入数据项,并且③在遇到不可能属于此项的字符时停止(对于这个不可能属于当前项的字符,scanf会把他"放回原处",以便在扫描下一个输入项或者下一次调用scanf函数时再次读入)

如果读入数据成功,那么scanf 函数会继续处理格式串中的剩余部分;如果某一项不能成功读入,那么scanf函数将不再查看格式串中的其余部分和余下的输入数据,并且立即返回

2.2.2 如何识别数

对①、③的说明:主要讨论scanf如何识别整数和浮点数

在寻找数的起始位置时,scanf函数会忽略空白字符(white-space character,包括空格符、水平和垂直制表符、换页和换行符)

scanf除了在匹配字符(%c)的情况下,均能跳过先导空白字符,因为字符不可能是他们的一部分

整数:首先寻找正号或负号,然后读取数字直到一个非数字时才停止

浮点数:寻找一个正号或负号,随后是一串数字(可能含有小数点),再后是一个指数(可选),指数由字母e或E、可选的符号和一个或多个数字组成。用scanf时,%f,%e和%g可以互换

示例:

示例输入:1-20.3-4.0e3\n
函数调用:scanf("%d%d%f%f", &i, &j, &x, &y);
运行结果:i = 1,j = -20,x = 0.3,y = -4.0e3

特别注意:换行符\n会留在输入缓冲区中,供之后的函数读入

2.2.3 如何处理普通字符

对②的说明:主要对格式字符串中普通字符的处理

scanf("%d /%d", &a, &b); // 其中%d为转换说明,/以及之前的空格为普通字符

① 空白字符(空格、换行、制表符)

格式串中的一个空白字符可以与输入中的任意数量的空白字符相匹配,包括零个

所以在输入格式串中有\n是个坏主意,他会使scanf在遇到下一个非空字符时才停止

② 其他字符

当在格式串中遇到非空白字符时,scanf函数将把她与下一个输入字符进行比较,如果两个字符相匹配,那么scanf函数会放弃输入字符而继续处理格式串。如不匹配,scanf会把不匹配的字符放回输入中,然后异常退出,而不进一步处理格式串和从输入中读取字符

2.3 使用注意事项

① 编译器也不检查转换说明符与输入变量的数量是否匹配,也不检查每个转换是否适合相应的变量类型

② 基于上述原因,许多专业C程序员会避免使用scanf函数,而是采用字符格式读取所有数据,然后再转换成数值形式(这个我还不会!)

C程序设计语言现代方法03:格式化输入输出相关推荐

  1. c语言字符型输入格式化,c语言之字符串和格式化输入输出

    字符串和格式化输入输出 #include #include #define DENSITY 62.4 int main(void) { float weight, volume; int size, ...

  2. C程序设计语言现代方法18:声明

    目录 1. 声明的语法 2. 变量的性质 2.1 变量性质的构成 2.2 变量默认性质 2.3 修改变量默认性质 2.3.1 修改局部变量默认性质 2.3.2 修改全局变量默认性质 2.4 exter ...

  3. C程序设计语言现代方法17:指针的高级应用

    目录 1. 动态存储分配 1.1 malloc函数 1.2 calloc函数 1.3 realloc函数 1.4 free函数 2. 空指针NULL解析 2.1 NULL的定义形式 2.2 程序如何知 ...

  4. C程序设计语言现代方法15:编写大型程序

    目录 1. C语言程序一般构成 2. 源文件 2.1 源文件内容 2.2 将文件划分成多个源文件的优点 3. 头文件 3.1 包含头文件的3种方式 3.2 头文件共享内容 3.2.1 宏定义和类型定义 ...

  5. C程序设计语言现代方法14:预处理器

    目录 1. 预处理器工作原理 1.1 预处理器性质 1.2 预处理器主要功能 1.3 GCC编译过程及常用选项 1.3.1 GCC编译过程 1.3.2 编译选项实例 1.4 注意事项 2. 预处理指令 ...

  6. C程序设计语言现代方法13:字符串

    目录 1. 字符串字面量 1.1 定义 1.2 字符串字面量包含转义序列 1.3 延续字符串字面量 1.3.1 使用续行符 1.3.2 仅用空白字符分割字符串字面量 1.4 存储字符串字面量 1.5 ...

  7. C程序设计语言现代方法12:指针和数组

    目录 1. 指针的算术运算 1.1 概述 1.2 C语言支持的算术运算类型 2. 指针的比较 3. 指针用于数组处理 4. 数组名与指针 4.1 用数组名作指针 4.2 数组取下标操作 4.3 惯用法 ...

  8. C程序设计语言现代方法08:数组

    目录 1. C语言中的变量 2. 一维数组 2.1 数组的声明 2.2 数组初始化 2.3 对数组使用sizeof运算符 3. 多维数组 4. 常量数组 4. C语言数组类型 4.1 数组类型 4.2 ...

  9. C程序设计语言现代方法07:基本类型

    目录 1. 基本类型和构造类型 1.1 基本类型 1.2 构造类型 2. C语言两大类型(存储格式根本上不同) 3. 整数类型 3.1 6种有效组合 3.2 整数常量 3.3 整数溢出 3.4 读写整 ...

最新文章

  1. iOS下JS与OC互相调用(五)--UIWebView + WebViewJavascriptBridge
  2. 算法--------二叉树的前序遍历
  3. 为什么转换到Visual Studio 2017如此 “容易”
  4. 2019年创业融资去哪个平台好?创成汇
  5. 视觉SLAM笔记(30) 特征点法
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的毕业论文设计管理系统
  7. java编程规范之java命名规范
  8. CAD/CAM技术的现状分析
  9. Andriod+SpringBoot 图书馆管理系统
  10. 《C语言入门经典》Ivor Horton第十章练习题3
  11. CAP迷思:关于分区容忍性
  12. 海淀区第九届单片机竞赛获奖名单_第九届蓝桥杯国赛电子类单片机设计与开发组获奖名单...
  13. Multisim基础 有极性的电容 添加元件的位置
  14. POC_3COM NJ2000
  15. 什么是 Benchmarks?
  16. 【ubuntu16.04 LTS】ping百度通,但浏览器打不开百度网页
  17. 毕博与中国大学mooc对比
  18. 用计算机处理信息图文,浅谈计算机技术在报纸图文信息处理中的应用
  19. 搜索行为和关键词分析(二):用户也会犯错(转)
  20. 金山快盘开发 (0)

热门文章

  1. python elementtree 命名空间_用Python中的命名空间通过‘ElementTree’解析XML
  2. 城市中计算机控制系统的应用,计算机联锁控制系统在北京城铁中的应用
  3. mysql做wp网站_mysql做wp网站
  4. Tomcat安装后没有出现tomcat主页
  5. linux查看网卡的驱动命令行,linux查看网卡驱动模块信息
  6. tp5ajax即点即改,TP5中即点即改,json分页,单删
  7. Java招聘数据统计_拉勾网2019年3月20日招聘数据统计
  8. oracle按位或运算符怎么用,Oracle按位运算符
  9. Spring Cloud Feign使用详解
  10. redhad安装git