头文件为
int scanf( const char *format [,argument]... );
int printf( const char *format [, argument]... );
在我们写代码的时候,以及刷oj的题的时候,会经常用到printf函数(从内存中打印信息到屏幕外),以及scanf函数(从键盘在输入信息到内存),那你有没有对这两则函数有更深刻的认识?下面将介绍它们的所以的“个性”。
所谓占位符,是指在输出文本中指定占位符,这个位置可以由其它位置植入。如: printf("庄梦涵有%d个老师",1);,我们可以通过调整第二个参数来改变输出文本的,庄梦涵有老师的个数。其中printf函数,要想玩出花样,那是少不了对占位符的深刻理解的。
占位符一个字符统一为%,第二个字符为数据类型,如%zd - 打印操作符sizeof()返回的size_of的数据。
占位符与printf中的参数是一一对应的关系,如有n个占位符,则需要n+1个参数。
常见的占位符有:
%c - 打印字符 %s - 打印字符串 %p - 打印地址 %zd - 打印size_t类型
%hu - 打印无符号短整型 %ho - 打印八进制短整型 %hx - 打印十六进制整型 %hd - 打印十进制短整型
%u - 打印无符号整型 %o - 打印八进制整型 %x - 打印十六进制整型 %d - 打印十进制整型
%lu - 打印无符号长短整型 %lo - 打印八进制长整型 %lx - 打印十六进制长整型 %ld - 打印十进制长整型
%llu - 打印无符号长长短整型 %llo - 打印八进制长长整型 %llx - 打印十六进制长长整型 %lld - 打印十进制长长整型
%f - 打印单精度浮点型 %lf - 打印双精度浮点型 %Lf - 打印长精度浮点型。
printf()允许限定占位符的最小宽度,格式为:%*d,: * 表示要限定占位符的最小宽度,我暂时把它作为未知数。可以直接在输出文本中更改,也可以如下操作(*的特殊用处):
如图可知,若123宽度小于指定的5,所以不够的用空格,若超出了限定的宽度,则按实际宽度处理。默认是右对齐的,如果想要左对齐,在%后面加一个 - 即可;注意,后面的参数请按顺序来。对于小数而言,宽度表示整个数据的宽度,小数默认是六位。
浮点型类型的打印,都是默认小数的个数是6位,但是我们可以通过一些手段,对小数进行限定,其格式为%.*f,(.*)表示限定小数的格式,这里的*我暂时把它作为未知数(他也一样有特殊用处)。
默认情况,我们打印的数据,正数默认不带正号,若我们想要让打印的数据带上正负号,则可以%后面加上+号。
格式为 ( %,*s )
用于读取用户的键盘(标准输入流)输入,程序运行到这个语句的时候,就会停下来,等待用户的输入,用户输完数据后,用户按下回车键,程序开始处理用户输入的数据。
博文开头就列举了这两个函数的声明,它俩的语法几乎差不多。
第一个参数,是格式字符串,里面放置占位符。其余参数,用于存放用户输入的变量
解读用户输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条的字符为止
注:
数据都是有类型,其类型与占位符一一对应,
占位符与参数是一一对应的。有n个占位符,(包括格式字符串)就有n+1个参数
唯一要注意的,后面的参数是地址(也就是变量前要加&符号),否则会出现程序出错(反正我刚敲代码的时候经常出错)。
读取的时候,自动过滤空白字符,包括(空格,制表符,换行符)
scanf的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何项或匹配失败,则,返回0,如果在成功读取任何数据之前遇到读取错误或遇到文件结束标志,则返回EOF(其值为-1);
3.1 %c
我们都知道,像占位符%d,在读取用户输入数据的时候都会忽略起始的空白字符,但是%c不会,因为像空格啊(' '),制表符啊(\t),换行符啊(\n),都算作字符也就与%c匹配。我们若想忽略起始的空白字符可以这样写
char c = 0;scanf(" %c",&c); 就是在占位符%c前面加上空格。
3.2 %s
scanf读取%s的时候,并不是简单的读取字符串,而是以非空白字符开始读取,到第一个空白字符停止,并在其末尾补上'\0',所以我们不能得到含有空白字符的字符串。
只要将(*)加在任意占位符中%的后面,该占位符就不会返回值,解析和就被丢弃。
若:scanf("%d-%c", &a, &c); 则:输出的时候必须按照格式。
此时第一次读取时%d与12相对应,而第二次读取时 - 与空格匹配失败,返回值为1。
但是如果我们可以用忽略赋值符(*)其用法如下:从中我们还可以看出,明明读取的是4个字符,但返回值却是2,所以其返回值也不包括其中,