C03-格式化输入输出

news/2024/10/4 2:26:31

在探索难以实现的问题时,问题本省的简单性只会使情况更糟

1.printf 函数

printf函数被设计用来显示格式串(format string)的内容,并且在该串中的指定位置插入可能的值。调用printf函数时必须提供格式串,格式串后面的参数是需要在显示时插入到该串中的值。
显示的值可以是常量变量或者更加复杂的表达式。调用printf函数一次可以打印的值的个数没有限制。

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

格式串包含普通字符转换说明(conversion specification),其中转换说明以字符%开头。转换说明是用来表示打印过程中待填充的值的占位符
跟随在字符%后边的信息指定了把数值从内部形式(二进制)转换成打印形式(字符)的方法,这也就是“转换说明”这一术语的由来。例如,转换说明%d指定printf函数int型值从二进制形式转换成十进制数字组成的字符串,转换说明%ffloat型值也进行类似的转换。

int i = 10;
int j = 20;
float x = 43.28f;
float y = 55.0f;printf("i=%d, j=%d, x=%f, y=%f", i, j, x, y);

1.1 转换说明

转换说明符给程序员提供了大量对输出格式的控制方法,%d与%f是最简单的转换说明,而转换说明具有复杂的展示形式。

格式化输入输出的转义字符完整的表达式为%m.pX
m
m可以指定最小字段宽度(minimum filed width),如果指定的最小宽度小于要显示的字符数时,则原有的字符不会被隐藏;如果指定的最小宽度大于要显示的字符数时,则会在字符串前添加相应空格。
m为正数时,字符右对齐(默认);m为负数时,字符左对齐。

p
精度p(precision)的含义依赖于转换说明符(conversion specifter)X 的选择。X表明在显示数值前需要对齐进行哪种转换。常用的转换说明符有:

  • d:表示十进制形式的证书,p指明了待显示的数字的最少个数。默认为1
  • e:表示指数形式的浮点数,p指明了小数点后应该出现的数字个数。默认为6,如果p0则不显示小数点
  • f:表示定点十进制形式的浮点数,没有指数。P的作用与e相同
  • g:表示指数形式或者定点十进制形式的浮点数,形式的选择根据数的大小决定。在显示大小适中的数值时,会采用定点十进制的形式,若是显示非常大或者非常小的数字时,会采用指数形式以减少所需要的字符数
%d %e %f %g
%5d  %-5d  %5.3d
%10.3f  %10.3e %-10g

1.2 转义序列

格式串中常用的代码\n被称为转义序列(escpae sequence)。转义序列使字符串包含一些特殊字符而不会使编译器引发问题,这些字符包括非打印的字符和对编译有特殊含义的字符

转义序列 含义
\ \字符
' ' 字符
" " 字符
? ? 字符
\a 警报铃声
\b 退格键
\f 换页符
\n 换行符
\r 回车
\t 水平制表符
\v 垂直制表符
\ooo 一到三位的八进制数
\xhh . . . 一个或多个数字的十六进制数

2.scanf 函数

scanf函数也根据特定的格式读取输入。相printf函数格式串一样,scanf函数的格式串也可以包含普通字符和转换说明两部分。

调用scanf函数是读数据的一种有效但不理想的方法。我们应该避免使用scanf函数,而是采用字符格式读取所有数据,然后再把他们转换成数值形式

scanf("%d%d%f%f",&i,&j,&x,&y);
// 输入:1 -20 .3 -4.e3
// 使 i=1, j=-20, x=0.3, y=-4.0e3
// 注意输入时的空格

2.1 scanf 函数的工作方法

scanf函数本质是是一种模式匹配函数,试图把输入的字符组与转换说明相匹配。

调用scanf函数时, scanf函数从左边开始处理字符串中的信息。对于格式串中的每一个转换说明,scanf函数从输入的数据中定位适当类型的项,并在必要时跳过空格。
然后,scanf函数读入数据项,并且在遇到不可能属于此项的字符时停止。如果读入数据项成功,那么scanf函数会继续处理格式串的剩余部分;如果某一项不能成功读入,那么scanf  函数将不再查看格式串的剩余部分(或者余下的输入数据)而立即返回。
在寻找数的起始位置时,scanf函数会忽略空白字符 (white-space  character,包括空格符、 水平制表符垂直制表符换页符换行符)。因此,我们可以把数字放在同一行或者分散在几行内输 入。

scanf("%d%d%f%f",&i,&j,&x,&y);
// 将输入分为三行
/*
1 -20
.3 -4.0e3
*/
// 使 i=1, j=-20, x=0.3, y=-4.0e3

scanf函数会把多行的输入看成是一个连续的字符流

scanf函数遇到一个不可能属于当前项的字符时,它会把此字符放回原处,以便 在扫描下一个输入项或者下一次调用scanf函数时再次读入。可以尝试运行下列代码
![[C语言代码块#循环输入]]

2.2 格式串中的普通字符

空白字符
当在格式串中遇到一个或多个连续的空白字符时, scanf函数从输入中重复读空白字符直到遇到一个非空白字符(把该字符“放回原处”)为止。格式串中空白字符的数量无关紧要,格式串中的一个空白字符可以与输入中任意数量的空白字符相匹配(包括零个),并且在格式串中包含空白字符并不意味着输入中必须包含空白字符。

其它字符
当在格式串中遇到非空白字符时,scanf函数将把它与下一个输入字符进行比较。如果两个字符相匹配,那么scanf函数会放弃输入字符而继续处理格式串。如果两个字符不匹配,那么scanf函数会把不匹配的字符放回输入中,然后异常退出,而不进一步处理格式串或者从输入中读取字符。
例如,scanf("请输入:%d", &i);中,运行时,需要先输入字符串“请输入:”,然后才开始输入转换说明.

2.3 printf函数和scanf函数中的注意事项

  • printf函数中,变量前不需要添加字符&
  • printf函数建议使用转义字符\n结尾
  • printf函数中如果要打印%,要连续使用两个百分号%%
  • scanf函数会在寻找数据项时跳过空白字符,所以除了转换说明,格式串常常不需要包含字符

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/67538.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Netflix 錯誤 NW-8-18

环境 PS5的奈飞,OpenWrt的树莓派做软路由解决方案 首先重置,如果不行,关机拔掉电源线等待三分钟,重试 Netflix。如果这篇文章对你有用,可以关注本人微信公众号获取更多ヽ(^ω^)ノ ~

Python算法学习

算法学习心得,源码均为Python实现目录绪论数据结构算法算法的特征算法的评价算法的时间复杂度算法的空间复杂度递归汉诺塔问题(递归调用)查找排序二分查找检查排序是否完成冒泡排序选择排序插入排序希尔排序(高级版插入排序)快速排序堆排序(二叉树)python中内置好的堆排…

数学建模学习

数学建模学习,包含各种常用模型和Matlab源码目录 目录目录评价类方法层次分析法搜索引擎算法步骤算法代码F4锁定单元格优劣解距离法算法步骤算法代码自输入权重代码基于熵权法权重的代码灰色关联分析传统数理统计的不足之处该方法的好处算法步骤算法代码基于灰色关联度权重的代…

下载、安装、配置 android-studio-2021.1.1.22-windows

软件安装包:图1 软件安装包提示删除已经存在的版本:图2 提示删除已经存在的版本根据提示选择是:图3 根据提示选择是继续安装:图4图5图6图7图8图9图10

实景三维赋能城镇数字化规划

在数字化浪潮的推动下,城镇规划正经历着前所未有的变革。实景三维技术以其独特的优势,为城镇数字化规划提供了强大的技术支持。今天,我们将深入探讨实景三维技术如何赋能城镇数字化规划。一、城镇规划面临的挑战随着城镇化进程的加快,城镇规划面临着人口增长、资源分配、环…

土地规划中的公共设施布局:科学规划,赋能土地高效利用的艺术

在城市与区域发展的宏大叙事中,公共设施布局如同血管与神经网络,支撑着城市的脉动与感知。合理规划公共设施布局对于提升土地使用效率、促进社会公平、增强居民福祉至关重要。本文将深入探讨如何通过科学方法与创新策略,实现公共设施的高效布局,绘就城市发展的智慧蓝图。一…

js学习1

js实现简单交互 js的外联引入 必须在body里&&你需要交互的元素下方 e.g. <body><div id="box">演示1</div><script src="./演示1.js"></script> </body>实现点击交互 样例1 <!DOCTYPE html> <html l…

动态规划Leetcode96.不同的二叉搜索树

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 解题步骤如下:二叉搜素树的相关概念 寻找规律 思路建立 代码实现1.二叉搜索树的相关概念 ①:若左子树不空,则左子树所有节点的值均小于它的根节点…