scanf函数和printf函数

printf函数

介绍

在使用这个函数之前我们应当介绍一下这个函数。在笔者第一篇的博客中也曾介绍过。printf是由print和format,即打印格式。详细点说,printf()的作用是将参数输入到屏幕上,按照指定的格式打印

占位符

之前的文章我介绍过占位符是什么。占位符由%和字符组成,第一个字符必须为%,第二个则表示的是占位符的类型。

而占位符的类型有很多,具体内容和功能可以上网查阅,我们就不重点介绍了。

占位符所在的位置是在printf()函数的()中,输出的文本中可以有多个占位符,切记,顺序必须相对应,如

printf("%d*%d=%d ", i, j, i * j);

假设i为1,j为2,那么这个结果输出的就是1*2=2,括号内的整型与占位符一一对应

输出格式

printf()可以定制占位符的输出格式

限定宽度

我们先看一个示例

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

从中发现,%d中间加了个数字5,而这就限定了占位符至少要占到五位,所以程序运行的结果为  123(123前包含了两个空格,代表了空字符),要知道的是,%5d默认的是右对齐,如果要左对齐的话,则需使用%-5d,这是用于左对齐的占位符。

在占位符中,%f用于小数,默认打印小数点后六位,然而%xf表示输出的浮点数为x位(其中,x代表数字)。若希望保留小数点后x位,可使用%.xf。%f还有一种用法,那就是%x.yf(这个占位符代表的意思是最少有x位,小数点后有y位。)

scanf函数

这个函数将是本篇博客重点介绍的函数。scanf函数用一句话来说就是用于读取用户的键盘输入

首先我们先来讲解一下scanf函数在vs使用时的弊端。

如果直接在代码中使用scanf,那么程序将不会运行,并且会报错,如果想要正常使用,只需在每个源文件的开头加上一串代码

#define _CRT_SECURE_NO_WARNINGS

这样才能够使用scanf

scanf的使用

scanf的使用方法与printf类似,我们举一个例子来讲解

scanf("%d",&i);

这是一个整型的输入,可以看出括号内唯一一个与print有区别的地方就是在整型前面加上了一个&,这个&叫做取地址符,无论是浮点型还是字符都得加上

如果要同时输入多个字符,我们可以像以下代码使用

scanf("%d %d %f %d",&i,&j,&x,&y);

要知道的是,scanf()处理数值占位符时,会自动过滤空白字符,包括空格,制表符,换行符等。

scanf的返回值

scanf()的返回值是一个整数,返回值则表示成功读取的变量个数。我们可以用以下方法来验证

#include <stdio.h>
int main()
{
 int a = 0;
 int b = 0;
 float f = 0.0f;
 int r = scanf("%d %d %f", &a, &b, &f);
 printf("a=%d b=%d f=%f\n", a, b, f);
 printf("r = %d\n", r);
 return 0;
}

程序运行时,如果我们同时输入三个数,结果会怎样呢

 

 我在程序中输入了1,2,3.14这三个数,我们得到的返回值为3,即变量个数为3.

如果我们只输入两个数呢

(在scanf函数中,如果要提前结束输入,则需连续按三个ctrl+z)

具体实例如下

 由于我们没有输入第三个数,则程序返回的数是2

这样,我们就能证明返回值是一个整数了。

占位符

scanf的占位符与printf的占位符有点区别,具体的差别,是我们接下来要说的

%c是字符的占位符,但是这个占位符在scanf函数中不能忽略空白字符,无论该字符是否为空格,总是返回当前第一个字符。如果要强制跳过字符前的空白字符,可输入:

scanf(" %c,&ch");

即在%c添加一个空格

%s是字符串的占位符,但是在scanf函数中,%s不会包含空白字符,无法用来读取多个单词,除非多个%s一起使用

另外,由于scanf()不会检测字符串是否会超过数组长度,则需使用%【m】s表示读取字符串的最大长度,后面的字符将被丢弃

赋值忽略符

假设我们要输入一个具体的年月日,之间用横杠隔开,我们可能会输入以下一串代码

#include <stdio.h>
int main()
{
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d-%d-%d", &year, &month, &day);
 printf("%d %d %d", year, month, day);
 return 0;
}

由于scanf的整型占位符之间有横杠,因此我们在输入时,数字之间也应该有横杠,结果是这样的

 看得出来,结果很容易就输出了。

但是,如果我们想改下中间的连字符,打成1990/8/8,这串代码能实现吗,结果如下

 显然,想用其他连字符时,该程序就无法正确输出了。

因此,我们需要用到一个特殊符号来代替横杠的位置,即%*c

所需要的代码如下

int main()
{
	int year = 0;
	int month = 0;
	int day = 0;
	scanf("%d%*c%d%*c%d", &year, &month, &day);
	printf("%d %d %d", year, month, day);
	return 0;
}

当我们输入1990/8/8时,结果如下

 若输入1990-8-8,结果则是

 显然,这时候我们用任何的连字符,程序都能够成功运行。

%*c便被我们成为赋值忽略符

结语

这两个函数笔者学习的程度较浅,目前只了解了这么多,更多的还需后续学习跟进。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值