本文讲介绍C语言中格式化输入函数scanf的用法,并且会结合一些实例进行讲解。无论在C语言中还是C++语言中,scanf都是一个非常重要以及常用的函数,所以是必须要掌握的。在今天的速成版里,相信大家可以通过我的例子快速掌握对于scanf格式化输入函数的使用。
1. 概述
scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。
该函数的原型为:
#include <stdio.h> //或者#include <cstdio>
int scanf(const char *format,...); //scanf函数原型
调用格式为:
scanf("<格式化字符串>", <地址表>); //scanf函数调用格式(此处为伪代码)
2. 详细用法
2.1 格式化说明符
scanf函数作为格式化输入函数,输入的变量类型都是需要制定类型的。见下表。(Ps.本人相对比cin更喜欢scanf的原因之一就是格式化可以节约不少时间,在刷题过程中节约一些因为数据量过大而在输入输出浪费的时间)
变量类型 | 中文名 | 格式字符 | 说明 |
---|---|---|---|
short | 短整型 | %u | 用键盘输入一个短整型 |
int | 整型 | %d | 用键盘输入一个整型 |
long | 长整型 | %ld | 用键盘输入一个长整型 |
long long | 长长整型 | %lld | 用键盘输入一个长长整型 |
char | 字符型 | %c | 用键盘输入一个字符类型 |
char [] | 字符数组 | %s | 用键盘输入一个字符数组 |
float | 单精度浮点型 | %f | 用键盘输入一个单精度浮点型 |
double | 双精度浮点型 | %lf | 用键盘输入一个双精度浮点型 |
2.2 用法:scanf("<格式化字符串>", 输入参数);
功能:将从键盘输入的字符转化为“<格式化字符串>”所规定格式的数据,然后存入以输入参数的值为地址的变量中。
我们首先来看一个程序:
#include <stdio.h>
int main(){
int i;
scanf("%d", &i); //&i 表示变量 i 的地址,&是取地址符
printf("i = %d", i);
return 0;
}
//输入:123
//输出:i = 123
要弄懂以上这个程序,我要给大家讲明两个点:
(1)我们从键盘输入的都是字符。比如我们从键盘输入123,它表示的并不是整数123,而是字符'1','2','3'。因为操作系统在接收键盘输入数据时,会把我们输入的内容全部当作字符来接收,此时就需要使用“<格式化字符串>”来输入的字符转换成我们想要的值。在该程序中,我使用"%d"将输入的字符'1','2','3'转换成了整型123。
(2)&是一个取地址运算符,&后面加变量名表示“该变量的地址”,所以&i就表示变量 i 的地址。&i`又称为“取地址i”,就相当于将数据存入以变量 i 的地址为地址的变量中。
看明白这两个点后,我们就可以明白scanf函数的意思就是:从键盘输入字符,并且通过“<格式化字符串>”(比如%d)转换成我们想要输入的类型,并且保存到对应变量中。
2.3 用法:scanf("字符串+<格式化字符串>", 输入参数);
这个用法相比上一个用法的区别,在格式化字符串边上又多了一些“小伙伴”,究竟是干什么用的呢?当然这个用法用的不多,但是大家一定要熟悉这个用法,才能避免因为细节导致的错误。
我们来看一个程序:
#include <stdio.h>
int main(){
int i;
scanf("i = %d", &i);
printf("i = %d", i);
return 0;
}
在scanf函数中,所有非格式化字符串内容都是需要我们原样输入的。比如在这个程序中,我们想要让i的值为123,那么必须要输入i = 123,才能够得到“i = 123”,少一个都不行,否则错误。
输入错误情况
输入正确情况
我们再来看一个程序。
#include <stdio.h>
int main(){
int a, b;
scanf("%d,%d", &a, &b); //输入a,b
printf("a = %d, b = %d", a, b); //输出a,b的值
return 0;
}
在上述程序中,我们发现在输入a,b的格式化字符串中间多了一个逗号,此时我们要如何输入才能使得输出结果为“a = 10, b = 20”呢?答案和上一题差不多,我们需要输入“10,20”,逗号是不可以少的,少了就错啦~
2.4 scanf使用注意事项
(1) “格式化字符串”需要和“参数”的个数一一对应
scanf函数使用过程中,需要把"格式化字符串"和"输入参数"一一对应。
#include <stdio.h>
int main(){
char ch;
int i;
// scanf("%c %d", &ch); //错误输入方法,没有i的输入参数
scanf("%c %d", &ch, &i); //输入:ch 6
printf("ch = %c, i = %d", ch, i); //输出:ch = ch, i = 6
return 0;
}
(2)输入的数据类型一定要与所需要的数据类型一致
在 scanf 中,对于从键盘输入的数据的类型、scanf 中“格式化字符串”的类型、变量所定义的类型,这三个类型一定要一致,否则就是错的。虽然编译的时候不会报错,但会出现运行错误的,则无法实现我们需要的功能。比如:
#include <stdio.h>
int main()
{
int i;
scanf("%c", &i); //i为int类型,如果这里使用%c为字符类型,编译不报错,但是运行有误
scanf("%d", &i);
printf("i = %d\n", i);
return 0;
}
(3)使用scanf输入数组数据时,要注意"格式化字符串"后面不要多空格
#include <stdio.h>
int main(){
int a[105], i;
for(i = 0 ; i < 5; i++){
//scanf("%d ", &a[i]);
//此时在输入完5个数据以后,还需要多输入一个空格,才能有结果
scanf("%d", &a[i]);
}
for(i = 0 ; i < 5; i++){
printf("%d ", a[i]);
}
return 0;
}
总结
scanf 的使用看似细节繁杂,但使用起来非常简单。就目前而言,只要掌握以下五点:
- 在 scanf 的“输入参数”中,变量前面的取地址符
&
不要忘记。 - scanf 中双引号内,除了“格式化字符串”外什么都不要写(输出特殊要求)。
- “输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。
- “输入控制符”的类型和变量所定义的类型一定要一致。对于从键盘输入的数据的类型,数据是用户输入的,程序员是无法决定的,所以在写程序时要考虑容错处理,这个稍后再讲。
- 使用 scanf 之前加入注释,记录需要输入的内容。
以上是我对于scanf一些常用用法的整理,适合入门学习,后续我也会出更多用法的版本~有任何问题请大家及时指出!