C语言的scanf实现输入 详解笔记

scanf作用

scanf将键盘输入的字符串根据转换规范,转换成二进制表示的整数、浮点数、字符或
字符串等。
根据用户的输入 赋值给程序的数据

举个例子

#include <stdio.h>
int main()
{
	char c;
	short s;
	int n;
	long l;
	float f;
	double df;
	scanf("%hhd %hd %d %ld %f %lf", &c, &s, &n, &l, &f, &df);
	printf("%d %d %d %d %f %fn", c, s, n, l, f, df);
	return 0;
}

运行程序后,在键盘输入:“11 22 33 42 5.6 71.8”。scanf函数,将字符串"1 2 3 4 5.6 7.8",根据转换规范,
分别转换为各类二进制数据,并存储到变量中

scanf的规范点

  1. scanf是一个变参函数。
scanf("%hhd %hd %d %ld %f %lf", &c, &s, &n, &l, &f, &df);
scanf("%d %ld %f %lf", &c,  &l, &f, &df);
可以根据需求调整参数数量  类型也可调整
  1. scanf的第一个参数是字符串
scanf("%d %ld %f %lf", &c,  &l, &f, &df);
"%d %ld %f %lf" 被双引号包裹 字符串
  1. scanf的第一个参数内容为匹配字符以及转换规范
scanf("%d %ld %f %lf", &c,  &l, &f, &df);
%d %ld %f %lf 就是和输入信息匹配的字符串
根据转换规范  把输入的信息转为对应的数据类型

scanf("%d %ld %f %lf", &c,  &l, &f, &df);
%d(空格)%ld(空格)%f(空格)%lf
那么输入 也需要用空格进行分开 保持格式一致  12 44 12.02 45.2
scanf("%d,%ld,%f,%lf", &c,  &l, &f, &df);
%d,%ld,%f,%lf  如果是逗号的话输入 就需要用逗号隔开 12,44,12.02,45.2
  1. scanf的后续参数,是转换完成后,数据的存放位置
    在这里插入图片描述
    如果scanf将转换后的二进制存储到基本变量当中,请在变量名前加&。
    如果scanf将字符串存储到字符数组中,字符数组名不用加&
scanf("%d %ld %f %lf", &c,  &l, &f, &df);
&c,  &l, &f, &df 
就是把输入的信息转为对应的类型 存放的位置
  1. 转换规范的写法与数量,需要与后续的参数类型和数量对应

在这里插入图片描述
前面几个输入 后面介个接受
前面的类型 和后面的接受类型一致

转换规范

不同转换规范代表的转换方式如下表:

长度指示符 转换规范 转换为某种类型的二进制
hh d char
h d short
d int
l d long
ll d long long
hh u unsigned char
h u unsigned short
u unsigned int
l u unsigned long
ll u unsigned long long
f float
l f double
c 字符对应的ASCII码
s 字符串中字符对应的ASCII码

用法
输入 浮点型float
找到 float 查看占位符 %f
输入 unsigned short
找到unsigned short查看占位符 %hu

常见的输入错误

长度正确但类型错误

#include <stdio.h>
int main()
{
	long long ll;
	scanf("%lf", &ll);
	printf("%lldn", ll);
	printf("%fn", ll);
	return 0;
}

输入字符串数值大于转换类型取值范围

#include <stdio.h>
int main()
{
	short s;
	scanf("%hd", &s);
	printf("%dn", s);
	return 0;
}

我们输入了字符串 “2147483467” name超出了hd 的范围 无法得出正确的结果

变量放不下转换结果

#include <stdio.h>
int main()
{
	short s;
	scanf("%d", &s);
	printf("%dn", s);
	return 0;
}

把int 转入 short
我们输入了字符串 “2147483467” ,该字符串被转换规范 “%d” 匹配。
接下来,字符串 “2147483467” 将被转换为int类型的二进制表示,4个字节。
最后,转换后的4个字节的数据被short类型的变量s接收,丢失了2个字节。
所以,无法得出正确的结果

解决就是

使用scanf的时候请注意,输入字符串的数值与转换规范和接收转换结果的变量类型必须匹配才能得到 正确结果

占位符 和数据类型要一一对应

实现整数的输入

#include <stdio.h>

int main()
{
	//整形输入
	char a;
	short b;
	int c;
	long d;
	long long e;
	scanf("%hhd %hd %d %ld %lld",&a, &b, &c, &d, &e);
	printf("%hhd %hd %d %ld %lld", a, b, c, d, e);
	return 0;
}

实现小数的输入

	float f;
	double lf;
	scanf("%f %lf",&f,&lf);

实现字符输入

	char ch;
	scanf("%c",&ch);

字符串的输入

	char str[20];
	scanf("%s", str);//不需要&

scanf与printf的不同

  1. printf的后续参数不要加&,而scanf由于需要一个地址,所以对于基本变量需要加&,数组则不需
    要。
  2. printf的参数由于比int小的变量会升级为int,float会升级为double。所以,转换规范d可以用于
    char,short,int。转换规范f可以用于float和double。但是scanf是直接把转换结果送到接收变量
    中,必须严格使用转换规范