printf(scanf)【详解归纳】

一、前言

头文件为

int scanf( const char *format [,argument]... );

int printf( const char *format [, argument]... );

    在我们写代码的时候,以及刷oj的题的时候,会经常用到printf函数(从内存中打印信息到屏幕外),以及scanf函数(从键盘在输入信息到内存),那你有没有对这两则函数有更深刻的认识?下面将介绍它们的所以的“个性”。

二、输出函数(printf)

1.占位符

所谓占位符,是指在输出文本中指定占位符,这个位置可以由其它位置植入。如: 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 - 打印长精度浮点型。

2.限定宽度

printf()允许限定占位符的最小宽度,格式为:%*d,: * 表示要限定占位符的最小宽度,我暂时把它作为未知数。可以直接在输出文本中更改,也可以如下操作(*的特殊用处):

printf(scanf)【详解归纳】_第1张图片

如图可知,若123宽度小于指定的5,所以不够的用空格,若超出了限定的宽度,则按实际宽度处理。默认是右对齐的,如果想要左对齐,在%后面加一个 - 即可;注意,后面的参数请按顺序来。对于小数而言,宽度表示整个数据的宽度,小数默认是六位。

printf(scanf)【详解归纳】_第2张图片你看,包括小数点也算一个宽度。 

3.限定小数

浮点型类型的打印,都是默认小数的个数是6位,但是我们可以通过一些手段,对小数进行限定,其格式为%.*f,(.*)表示限定小数的格式,这里的*我暂时把它作为未知数(他也一样有特殊用处)。

printf(scanf)【详解归纳】_第3张图片

4.总显示正负号,

默认情况,我们打印的数据,正数默认不带正号,若我们想要让打印的数据带上正负号,则可以%后面加上+号。

5.输出部分字符串

格式为 ( %,*s )

printf(scanf)【详解归纳】_第4张图片

三、输入函数(scanf)

1.用法

用于读取用户的键盘(标准输入流)输入,程序运行到这个语句的时候,就会停下来,等待用户的输入,用户输完数据后,用户按下回车键,程序开始处理用户输入的数据。

博文开头就列举了这两个函数的声明,它俩的语法几乎差不多。

第一个参数,是格式字符串,里面放置占位符。其余参数,用于存放用户输入的变量

解读用户输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条的字符为止

注:

数据都是有类型,其类型与占位符一一对应,

占位符与参数是一一对应的。有n个占位符,(包括格式字符串)就有n+1个参数

唯一要注意的,后面的参数是地址(也就是变量前要加&符号),否则会出现程序出错(反正我刚敲代码的时候经常出错)。

读取的时候,自动过滤空白字符,包括(空格,制表符,换行符)

2.返回值

scanf的返回值是一个整数,表示成功读取的变量个数。

如果没有读取任何项或匹配失败,则,返回0,如果在成功读取任何数据之前遇到读取错误或遇到文件结束标志,则返回EOF(其值为-1);

printf(scanf)【详解归纳】_第5张图片printf(scanf)【详解归纳】_第6张图片

printf(scanf)【详解归纳】_第7张图片

3.两种占位符细节介绍

3.1 %c

我们都知道,像占位符%d,在读取用户输入数据的时候都会忽略起始的空白字符,但是%c不会,因为像空格啊(' '),制表符啊(\t),换行符啊(\n),都算作字符也就与%c匹配。我们若想忽略起始的空白字符可以这样写

             char c = 0;scanf(" %c",&c);  就是在占位符%c前面加上空格。

3.2 %s

scanf读取%s的时候,并不是简单的读取字符串,而是以非空白字符开始读取,到第一个空白字符停止,并在其末尾补上'\0',所以我们不能得到含有空白字符的字符串。

4.赋值忽略符(*)

只要将(*)加在任意占位符中%的后面,该占位符就不会返回值,解析和就被丢弃。

若:scanf("%d-%c", &a, &c); 则:输出的时候必须按照格式。

printf(scanf)【详解归纳】_第8张图片

此时第一次读取时%d与12相对应,而第二次读取时 - 与空格匹配失败,返回值为1。

printf(scanf)【详解归纳】_第9张图片

但是如果我们可以用忽略赋值符(*)其用法如下:从中我们还可以看出,明明读取的是4个字符,但返回值却是2,所以其返回值也不包括其中,

printf(scanf)【详解归纳】_第10张图片

你可能感兴趣的:(c语言)