【你了解printf()和scanf()吗?(浅谈)】


在这里插入图片描述

1.printf

printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。

1.1占位符

所谓占位符,就是该位置被其它值代入。

printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。

	// 参数 1	   2  3   4
printf("%d %d %d", a, b, c);
//占位符 1  2  3

C语言中有哪些占位符呢?
常用的如下:

  • %c :字符
  • %s:字符串
  • %d:十进制整数
  • %o:八进制整数
  • %x:十六进制整数
  • %f:float、douuble型小数
  • %lf:lone double型小数
  • %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
  • %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。

1.2输出格式

1.2.1限定宽度

printf() 允许限定占位符的最⼩宽度

#include <stdio.h>
int main()
{
    
    
 printf("%5d\n", 123); // 输出为 "  123"
 return 0;
}

上⾯示例中, %5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前面会添加空格。输出的值默认是右对⻬,即输出内容前⾯会有空格

  • 如果数据的长度大于限制的宽度,则原样输出
  • 如果想让数据左边对齐,在右边空格,则需要写成%-5d
#include <stdio.h>
int main()
{
    
    
 printf("%-5d\n", 123); // 输出为 "123  "
 return 0;
}

对于小数,该占位符也是一样的效果:
在这里插入图片描述

1.2.2显示正负

默认情况下, printf() 不对正数显示 + 号,只对负数显示-号。如果想让正数也输出 + 号,可以在占位符的 % 后⾯加⼀个 + 。

printf("%+d\n", 12);   //+12
printf("%+d\n", -12);  //-12

1.2.3限定小数的位数

输出小数时,想控制小数的位数可以使用 %.nf,其中n代表小数点后的位数。并且小数部分会进行四舍五入

printf("%.4f", 3.14159);  //3,1416

这个可以与限定宽度结合使用%m.nf,即总宽度为m,小数点后有n位。
如下:

printf("%12.4f", 3.14159);   //“      3.1416”

1.2.4输出部分字符串

%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.ms 指定输出的⻓度,其中 m 代表⼀个数字,表⽰所要输出的⻓度。
在这里插入图片描述

2.scanf

2.1基本用法

scanf() 函数⽤于读取用户的键盘输⼊。

  • 它的第⼀个参数是⼀个格式字符串,里面会放置占位符(与 printf() 的占位符基本⼀致),告诉编译器如何解读用户的输⼊,需要提取的数据是什么类型。
  • 这是因为 C 语⾔的数据都是有类型的, scanf() 必须提前知道⽤⼾输⼊的数据类型,才能处理数据。
  • 变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,而是地址,即将变量 i 的地址指向用户输⼊的值。
    • 如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加 & 运算符
 scanf("%d%d%f%f", &i, &j, &x, &y);
  • scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。

  • scanf() 处理⽤⼾输⼊的原理是:⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌,如下:

在这里插入图片描述

2.2scanf的返回值

scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数

  • 如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量EOF(-1)
    正确匹配:
    在这里插入图片描述
    匹配失败:
    在这里插入图片描述
    如果我们一个数也不输入,在vs中连续按3词ctrl+z,输出的是-1,也就是EOF
    在这里插入图片描述

2.3占位符

scanf()与 printf() 的占位符基本⼀致,其中有几个较为特别的,如下:

  1. %c不忽略空⽩字符,总是返回当前第⼀个字符,⽆论该字符是否为空格。若想忽略空白字符,需要在%c前加上空格
    在这里插入图片描述
  2. %s :它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌
    在这里插入图片描述
  3. 在scanf中,还有一个特殊的占位符:%[ ],在[ ]中指定一种匹配的字符比如%[0-9],遇到不在范围内的数字,匹配会停止。
    在这里插入图片描述
  4. scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。
    所以,储存字符串时,很可能会超过数组的边界,导致预想不到的结果。
    为了防⽌这种情况,使⽤ %s 占位符时,应该指定读⼊字符串的最⻓⻓度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后⾯的字符将被丢弃。
    未指定最大长度:程序运行起来是,虽然会正确的输出到屏幕上,但是会报一个错误,如下:
    在这里插入图片描述
    将上面的代码写成这样,就不会有数组溢出的风险了
    在这里插入图片描述

2.4赋值忽略符

有时候,用户输入的数据可能不符合预定的格式,scanf()的解析就会失败,
在这里插入图片描述
为了避免这种情况,scanf()提供了一个赋值忽略符*。
在这里插入图片描述
本次的分享就到这里啦,在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_69380220/article/details/133808833