printf和scanf控制符(学计算机从输入)

大家手中的电脑,手机,功能再怎么变化,再怎么酷炫,都会有两个基本功能:输入和输出;输入的是要处理的数据,输出的是处理过的数据,当前这里的数据是泛指,它可以是文本、音频、图片、视频等;回到C上那就是绕不开的printf和scanf函数,回想当初刚接触的时候,还给这两个函数折磨一阵子,废话不多说开始进入正题,接下来我们就来聊聊关于printf和scanf控制符?以下内容大家不妨参考一二希望能帮到您!

printf和scanf控制符(学计算机从输入)

printf和scanf控制符

大家手中的电脑,手机,功能再怎么变化,再怎么酷炫,都会有两个基本功能:输入和输出;输入的是要处理的数据,输出的是处理过的数据,当前这里的数据是泛指,它可以是文本、音频、图片、视频等;回到C上那就是绕不开的printf和scanf函数,回想当初刚接触的时候,还给这两个函数折磨一阵子,废话不多说开始进入正题。

一、简介

头文件stdio.h有两个使用最频繁的输入和输出的函数就是scanf和printf,原型如下:

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

根据特定的格式读取输入

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

显示格式串的内容,并且在该串中的指定位置插入可能的值

这两个函数参数中都有一个格式串(format),它们用来格式化输入和输出。格式串包含普通字符和转换说明,转换说明给程序员提供了大量对输入/输出格式的控制方法:即它可以包含格式化信息。其中转换说明以字符%开头,后接一个转换说明符(d、f、c、s等等)。转换说明是用来表示打印过程中待填充的值的占位符或者待输入的值的匹配格式。常用转换说明有:%d,%f,%c,%s;

二、printf函数

printf函数格式串中的普通字符完全如在字符串中出现的那样显示出来,而转换说明则要用待显示的值来替换。另外编译器不会检测格式串中转换说明的数量是否和输出项的数量相匹配。

一般地printf转换说明可以用%m.pX格式或%-m.pX格式,这个m和p都是整数常量,X是字母,m和p是可选的。如果省略p,m和p之间的小数点也要去掉。

转换说明中m是表示最小字段宽度——要显示的最少字符数量。如果要显示的数值所需的字符数少于m,那么值在字段内是右对齐的。如果要显示的值所需的字符数多于m,那么字段宽度会自动扩展为所需的尺寸。在m前放上一个负号会导致左对齐;

转换说明中p是表示精度,转换说明中x表示转换说明符;p主要依赖于转换说明符X的选择。X表明在显示数值前需要对其进行哪种转换。常用的精度(p)和转换说明符(X)关系如下:

d:表示十进制形式的整数。p指明了待显示的数字的最小个数,必要是在数前加上额外的0,如果省略p,则默认它的值为1。

e:表示指数(科学记数法)形式的浮点数。p指明了小数点后应该出现的数字的个数,默认值为6,如果p为0,则不显示小数点。(科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式(1≤|a|<10,a不为分数形式,n为整数),这种记数法叫做科学记数法。 [2] 例如:19971400000000=1.99714×10^13。计算器或电脑表达10的幂是一般是用E或e,也就是1.99714E13=19971400000000。)

f:表示定点十进制形式的浮点数,没有指数,p的含义与在说明符e中的一样。

g:表示指数形式或者定点十进制形式的浮点数,形式的选择根据数的大小决定。p指明了小数点后应该出现的数字的个数。与转换说明符f不同,g的转换将不显示尾随的零。此外,如果要显示的数值没有小数点后的数字,g就不会显示小数点。

编写程序时无法预知数的大小或者数值变化范围很大的时候 ,说明符g对于数的显示是特别有用的,显示大小适中的数时,说明符g采用定点十进制形式,显示非常大或非常小的数时,采用指数形式以减少所需的字符数。

三、scanf函数

scanf函数格式串的转换说明的用法和printf函数格式串中转换说明的用法本质上基本一样的。但是scanf函数内部机制与printf是有差别的,scanf函数本质上是一种“模式匹配”函数,试图把输入的字符流与转换说明相匹配。调用时scanf函数从字符串左边开始处理,对于格式串中的每一个转换说明,scanf函数从输入的数据中定位适当类型的项,并在需要时跳过空格。然后scanf读入数据项,并且在遇到不可能属于此项的字符时停止。如果读入数据项成功,那么scanf会接着处理格式串的剩余部分。如果某一项不能成功读入,那scanf将不再处理格式串的剩余部分并立即返回。

scanf函数在读入整数时,会首先寻找正号或负号,然后读取数字直到读到一个非数字时才停止。读入浮点数时,也会首先寻找正号或负号,随后是一串可能含有小数点的数字或者是一个指数。指数由字母e开始、可选的符号和一个或多个数字构成。scanf中转换说明%e,%f,%g是可以互换,在识别浮点数方面都遵循相同的规则。

当有scanf函数遇到一个不可能属于当前项的字符时,会把此字符放回原处,以便在扫描下一个输入项或下一次调用scanf函数时再次读入。

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

scanf对格式串中的普通字符处理,主要依赖于这个字符是否为空白字符。如果在格式串遇到一个或多个连续的空白字符,scanf从输入中重复读空白字符直到遇到一个非空白字符为止。格式串一个或多个空白字符可以与输入中任意数量空白字符相匹配。

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

综上所述,scanf函数一般有以下几个特性:

  1. 在使用scnf函数时,必须检查转换说明的数量与类型是否与输入变量的数量与类型相匹配。
  2. 通常scanf函数的格式串只包含转换说明,如scanf("%d%d%f%",....);
  3. 在输入scanf要读取的数字时,可以放在同一行或者分散在几行内输入。
  4. scanf格式串不应该像printf格式串那样常常包含很多普通字符。
四、总结

个人觉得,这两个函数对刚接触C的同学,学习起来会有点头疼,虽然函数原型很简单,但是这个格式串用法比较杂。所以要掌握这两个函数,还是先简单了解一下理论,再上机多实践,好好总结一下,应该可以达到知其然并知其所以然。而我写这篇文章就是我结合实际经验和书本理论知识整理的笔记,如果对大家有帮助,麻烦点个赞,谢谢了。

如果想要了解更详细的,可以参考《C语言程序设计 现代方法 第2版》这本书。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页