printf与scanf函数详解【建议收藏!!!】

前言

这篇文章将对printf和scanf函数的使用全面详解,包含基本用法,占位符,限定宽度,scanf与缓存的关系。

一、printf()函数

printf中的f表示格式化,表明输出按照一定的格式输出。它要包含一个头文件<stdio.h>。

1.基本用法:
形式:int printf ( const char * format, ... );
解析:返回值是指在屏幕输出字符总数,如果发生写入错误则反回负数;第一个参数是格式字符串,以这种格式输出;剩余参数是输出列表。
作用:按照格式字符串形式输出文本。
代码展示:

1	int main()
2	{
3		printf("Hello World!\n");
4		return 0;
5	}

输出结果:Hello World!
第五行中的"\n"是转义字符(换行的意思)。

2.占位符
printf可以在格式控制字符串中指定占位符,这个占位符是帮输出的内容占位。
代码展示:

int main()
{
	printf("The numbler is %d", 5);
	return 0;
}

输出结果:The numbler is 5
代码中的%d就是帮输出内容5占了一个位置。通俗来说,就是输出的内容会代替占位符输出(即5直接取代%d)。

3.占位符列举

• %a :⼗六进制浮点数,字⺟输出为⼩写。
• %A :⼗六进制浮点数,字⺟输出为⼤写。
• %c :字符。
• %d :⼗进制整数。
• %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
• %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
• %i :整数,基本等同于 %d 。
• %f :⼩数(包含 float 类型和 double 类型)。//float %f double - %lf
• %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e为⼩写。
• %G :等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
• %hd :⼗进制 short int 类型。
• %ho :⼋进制 short int 类型。
• %hx :⼗六进制 short int 类型。
• %hu :unsigned short int 类型。
• %ld :⼗进制 long int 类型。
• %lo :⼋进制 long int 类型。
• %lx :⼗六进制 long int 类型。
• %lu :unsigned long int 类型。
• %lld :⼗进制 long long int 类型。
• %llo :⼋进制 long long int 类型。
• %llx :⼗六进制 long long int 类型。
• %llu :unsigned long long int 类型。
• %Le :科学计数法表⽰的 long double 类型浮点数。
• %Lf :long double 类型浮点数。
• %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
• %o :⼋进制整数。
• %p :指针(⽤来打印地址)。
• %s :字符串。
• %u :⽆符号整数(unsigned int)。
• %x :⼗六进制整数。
• %zd : size_t 类型。
• %% :输出⼀个百分号

仅记住常用的就行。如:%d,%c,%f,%lf,%o,%x,%s。

4.限定宽度

printf() 允许限定占位符的最⼩宽度。下面是整数和浮点数的情况。

(1)整数情况

  • %md:表示输出宽度至少为m,大于m就原样输出,小于m就在左边补空格。输出的值默认是右边对齐。
  • %-md:表示左边对齐。在%后面加-就可以使输出的值左边对齐。
  • %0md和%.md:表示不足m宽度就在左边补0。

代码展示:

int main()
{
	int a = 23;
	int b = 123456;
	printf("%5d\n", a);
	printf("%5d\n", b);
	printf("%-5d\n", a);

	printf("%05d\n", a);
	printf("%.5d\n", a);
	return 0;
}

输出结果:
在这里插入图片描述

解析:
%5d 表⽰这个占位符的宽度⾄少为5位。如果大于5位原样输出。如果不满5位,对应的值的前⾯会添加空格。输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,可以在占位符的 % 的后⾯插⼊⼀个 -号。“%05d"和”%.5d"表示不足5位时前面补0。
(2)浮点数情况

  • %f不限制宽度和小数点后面位数。%f默认小数部分是6位。
  • %mf限制输出数据宽度位m,这个宽度包括小数点。大于这个宽度时原样输出。小于时左边补空格。
  • %m.nf:表示总宽度,包括小数点,n表示小数位数。不足总宽度时补空格。
  • %.nf:表示小数部分有n个位。
int main()
{
	float a = 3.678;
	printf("%f\n", a);
	printf("%5.2f\n", a);
	printf("%2f\n", a);
	printf("%.2f\n", a);
	return 0;
}

输出结果:
在这里插入图片描述

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

int main()
{
	printf("%+d\n", 5);//输出+5
	printf("%+d\n", -5);//输出-5
	return 0;
}

二、scanf()函数

(1)基本用法

scanf() 函数⽤于读取用户的键盘输⼊。程序运⾏到这个语句时,会停下来,等待用户从键盘输⼊。用户输⼊数据、按下回⻋键后, scanf() 就会处理用户的输⼊,将其存⼊变量。它的原型定义在头⽂件 stdio.h 。scanf() 的语法跟 printf() 类似。

形式:int scanf ( const char * format, ... );
解析:返回值是成功读取变量的个数,如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF (-1)。EOF - end of file ⽂件结束标志。第一个参数是格式字符串,剩下的是输入列表。
代码展示:

int main()
{
	int a = 0;
	int b = 0;
	float c = 0;
	int ret = scanf("%d%d%f", &a, &b, &c);//输入2 4 6.78
	printf("a=%d b=%d c=%f",a,b,c);
	printf("ret=%d", ret);//输出3
	return 0;
}

输出结果:
在这里插入图片描述
如果输入两个数后,按ctrl+z,提前结束输入:
在这里插入图片描述
原理: scanf() 处理用户输⼊的原理是,用户的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。解读用户输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。

(2) 占位符
scanf() 常⽤的占位符如下,与 printf() 的占位符基本⼀致。
• %c :字符。
• %d :整数。
• %f : float 类型浮点数。
• %lf : double 类型浮点数。
• %Lf : long double 类型浮点数。
• %s :字符串。
• %[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会停⽌。

注意:
1.上⾯所有占位符之中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符,总是返回当前第⼀个字符,⽆论该字符是否为空格。如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,表⽰跳过零个或多个空⽩字符。
2.scanf() 处理数值占位符(如%d,%f这些占位符)时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。
(3)赋值忽略符
有时,用户的输⼊可能不符合预定的格式。

int main()
{
	int y = 0;
	int m = 0;
	int d = 0;
	scanf("%d-%d-%d", &y, &m, &d);
	printf("%d %d %d", y, m, d);
	return 0;
}

上⾯⽰例中,如果用户输⼊ 2020-01-01 ,就会正确解读出年、⽉、⽇。问题是用户可能输⼊其他格式,⽐如 2020/01/01 ,这种情况下, scanf() 解析数据就会失败。
为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression character) * 。只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。

int main()
{
	int y = 0;
	int m = 0;
	int d = 0;
	scanf("%d%*c%d%*c%d", &y, &m, &d);
	printf("%d %d %d", y, m, d);
	return 0;
}

输出结果:
在这里插入图片描述

这段代码中, %*c 就是在占位符的百分号后⾯,加⼊了赋值忽略符 * ,表⽰这个占位符没有对应的变量,解读后不必返回。

三、scanf函数输入与缓存区关系

缓存区:
缓冲区(Buffer)又称为缓存(Cache),是内存空间的一部分。也就是说,计算机在内存中预留了一定的存储空间,用来暂时保存输入或输出的数据,这部分预留的空间就叫做缓冲区(缓存)。

作用:
有时候,从键盘输入的内容,或者将要输出到显示器上的内容,会暂时进入缓冲区,待时机成熟,再一股脑将缓冲区中的所有内容“倒出”,我们才能看到变量的值被刷新,或者屏幕产生变化。有时候,用户希望得到最及时的反馈,输入输出的内容就不能进入缓冲区。

代码展示:

int main()
{
	int arr[3] = { 0 };
	for (int i = 0; i < 3; i++)
	{
		scanf("%d", &arr[i]);
		if (1 == i)
		{
			printf("%d", arr[i]);
		}
	}
	return 0;
}

输出结果:
在这里插入图片描述
解析:这是一行输入完三个数字的方式,这种方式输入数字就会被存储在缓冲区,得等所有输入完才会输出5。
如果是每输入一个数字就按一下回车键就不会将数字存放在缓存区。

缓存区知识链接:http://c.biancheng.net/view/vip_1797.html

那么写到这里,本节内容就结束了,这篇博客花费了很长时间,但写完有满满的成就感,希望能帮助到大家,如果文章有不足的地方,欢迎在评论区留言指正,我们一起学习交流!
希望能得到大家的关注、点赞、评论、收藏! 你的支持是我最大的动力!!

  • 32
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值