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便被我们成为赋值忽略符
结语
这两个函数笔者学习的程度较浅,目前只了解了这么多,更多的还需后续学习跟进。