scanf() --通过键盘将数据输入到变量中
两种用法:
1. sacnf("输入控制符",输入参数);
功能:将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中
##:系统从键盘接收到的数据只能是字符,所以要使用输入控制符将数据转化为所规定的格式
2. sacnf("非输入控制符 输入控制符",输入参数);
功能:与前面一样,但是非输入控制符必须原样输入
如何使用scanf编写出高质量的代码:
1. 数据输入的形式必须与输入控制符的格式一样
2. 使用scanf之前最好先使用printf提示用户以什么样的方式来输入
3. scanf中尽量不要使用非输入控制符,尤其是不要使用\n
4. 应该编写代码对用户的非法输入做适当的处理
C语言scanf读取用户输入的机制
1. 系统将用户输入的数据保存在内存中,当读取时从第一位往后面逐个读取,
2. 比如输入控制符是%d时,若用户输入123m,此时系统会从1,2,3,m这
几个字符逐一读取,读到 m 时因为格式不正确,就不再往下读取。
等到输出时,则会把前面格式正确的 123 输出,而 m 不会被输出即使是
m 后面跟着正确格式的数据。
3. 如果输入是m123时,系统读到第一个 m 时格式不正确,所以后面的123不
再读取,自然也不会输出
4. 当连续输入两个数据时,比如输入123m 和 456,第一次读取的是123m,输
出时会把格式正确的 123 输出然后把 m 留着等到下一次接收输入的数据,
再次读取时会先从 m 开始分析,因为 m 在上一次读取中格式不正确而被留
在内存中,再次读取时 m 的位置相当于内存中最开始的位置,所以会先从
m 开始读取。这就是为什么要编写代码来应对用户的非法输入
/* 示例代码 测试输入控制符的格式 **
* 时间 2015-7-18 21:50 **/
# include <stdio.h>
int main()
{
int i, j;
printf("请输入两个整数,中间以逗号隔开:\n");
scanf("%d,%d", &i,&j); //&a 表示a的地址 &是一个取地址符
printf("i=%d, j=%d \n", i,j);
system("pause");
return 0;
}
/*
结果分析:
----------------------------
请输入两个整数,中间以逗号隔开:
4,5
i=4, j=5
请输入两个整数,中间以逗号隔开:
4 5
i=4, j=-858993460
----------------------------
总结:数据输入的形式必须与
输入控制符的格式一样
----------------------------
*/
/* 示例代码 测试scanf非输入控制符的形式 **
* 时间 2015-7-18 21:37 **/
# include <stdio.h>
int main()
{
int a;
printf("请输入一个整数:\n");
//scanf("%d", &a); //&a 表示a的地址 &是一个取地址符
scanf("m%d", &a);
printf("a=%d\n", a);
system("pause");
return 0;
}
/*
结果分析:
------------------------------------
当使用非输入控制符时,用户必须按格式输入
上例中:
m123是合法输入
123不是合法输入,会显示a的地址
m123n不是合法输入,但是结果是m123
-------------------------------------
*/
/* 示例代码 对用户非法输入做适当处理 **
* 时间 2015-7-18 22:17 **/
# include <stdio.h>
int main()
{
int i;
scanf("%d", &i); //&a 表示a的地址 &是一个取地址符
printf("i=%d\n", i);
while ( getchar() != '\n')
continue;
int j;
scanf("%d", &j);
printf("j=%d\n", j);
system("pause");
return 0;
}
/*
结果分析:
----------------------------
##不加处理代码结果
123m
i=123
j=-858993460
##加入处理代码结果
123m
i=123
345
j=345
----------------------------
*/