前言
scanf和printf可以说是我们最早接触的库函数了,因此,我们有必要单独详细地介绍它们一下
一、printf
基本用法
printf()的作用是将参数文本输出到屏幕,名字里面的f代表format(格式化)。表示可以定制输出文本的格式
#include <stdio.h>
int main(void)
{
printf(“Hello,world!”);
return 0;
}
上述命令会在屏幕输出一行文字"Hello,world!".
printf()不会在行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行
为了让光标移到下一行的开头,可以在输出文本的末尾加上\n
printf()是在标准库stdio.h定义的,在使用这个函数之前,必须在源码头文件头部引入这个头文件
占位符
printf()可以在输出文本那种指定占位符
所谓“占位符”,就是这个未知可以用其他值代入
上面示例中%d就是占位符,表示这个位置要用其他值来替换,占位符的第一个字符一律为百分号%,第二个字符表示占位符的类型,%d表示这里代入的值必须是一个整数
printf()的第二个参数就是替换占位符的值,上面的例子是整数3替换%d,执行后的输出结果就是There are 3 apples。
%s占位符,表示一个字符串,这也可以
输出文本里面可以使用多个占位符
printf()参数与占位符是一一对应关系,如果参数个数少于对应占位符,printf()可能会输出内存中的任意值
占位符列举
printf()的占位符有很多种类,与C语言的数据类型相对应,具体含义后续文章再介绍
输出格式
printf()可以定制占位符的输出格式
限定宽度
printf()允许限定占位符的最小宽度
上述示例中,%5d表示这个占位符的宽度至少为5位,如果不满5位,对应的值的前面会添加空格
输出的值默认是右对齐,即输出内容前面会有空格;如果希望改成左对齐,再输出内容后面添加空格,可以在占位符%的后面插入一个 - 号
总是显示正负号
默认情况下,printf()不对正数显示+号,如若想这么左,可以在占位符后面加一个+
限定小数位数
输出小数时,有时希望限定小数的位数,比如说想保留两位,就可以把占位符写成%.2f
还可以与限定宽度占位符使用
输出数字的头部有两个空格,’ . '也算一格
这两个限定值,还可以用*代替,通过printf()的参数传入
输出部分字符串
%s占位符用来输出字符串,默认全部输出,可以用%.[m]s来控制输出长度
二、scanf
基本用法
scanf用于读取用户的键盘输入,程序运行到这个语句的时候,会停下来,等待用户从键盘输入
用户输入数据,按下回车,scanf()就会处理用户的输入,将其存入变量
原型定义在头文件stdio.h
语法与printf()相似
scanf(“%d”, &i);
请注意,变量前面必须加上%运算符,scanf()传递的不是值,而是地主,即将变量i地址指向用户输入的值
scanf()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符
因此,用户输入数据之间,有一个或者多个空格不影响scanf解读数据,另外,用户输入回车键,将输入分成几行,也不影响解读
scanf()处理用户输入的原理是,用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读
解读用户输入的时候,会从上一次解读遗留的第一个字符开始,知道读完缓存,或者遇到第一个不符合条件的字符为止
上面示例中,scanf()读取用户输入时,%d占位符会忽略起首的空格,从而开始获取数据,读取到-13停下来,因为后面的:不属于整数的有效字符。这就是说,占位符%d会读取到-13。
第二次调用scanf()时,就会从上一次停止读取的地方,继续往下读取。这一次读取的首字符.,由于对应的占位符是%f,会读取到.45e12,这是采用科学计数法的浮点数格式。后面的#不属于浮点数的有效字符,所以会停在这里。
scanf的返回值
scanf()的返回值是一个常数,表示成功读取的变量个数
如果没有读取任何项,或者匹配失败,则返回0,如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1),可自行尝试,用ctrl+Z来结束读取进程
占位符
与printf()占位符基本一致,除了%c之外,都会忽略起始空白字符
如果要强制跳过字符钱的空白字符,可以写成下列形式
scanf(" %c", &ch);
这样就表示跳过零个或多个空白字符
另外用占位符%s来读取字符串其实有点问题,因为它的规则是,遇到第一个非空白字符时开始读取,直到遇到空白字符为止,这就意味着你无法读取包含空格的字符串
另外,scanf将字符串读入字符数组的时候,不会检测字符串是否超过了数组长度,所以,你需要自己把握数组边界,这时候你可以考虑%[m]s
赋值忽略符
有时候,用户的输入可能不符合预定的格式
上面示例中,用户理论上输入2020-01-01,可万一用户输入2020/01/01,就会出问题
为了避免这种情况,scanf提供了一个赋值忽略符’ * ',只要把*加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃
总结
今天讲了printf和scanf两个最先遇到的函数,其实这两个函数的学问很多,后续你们会慢慢发现的。