当前课程知识点:C语言程序设计(上) > 从问题到C语言程序设计 > 1.4 程序中的人机交互 > 1.4.2 scanf的用法
我们讨论完了printf
大家一定关心的是
我们怎么样把数据输入
其实在我们前面的程序里边
已经看见了
scanf
我们在这一块scanf跟printf
相比之下
它的格式要简单得多
但是它输入的时候
大家通常会碰到一些小问题
scanf跟它一样格式串地址表
我们没有叫变量表叫地址表
什么意思
是在printf里边这一块
取变量的地址
把你从键盘上敲进来的数据
数据放在这个地址里
这才叫给变量赋值了
所以就是
按照格式控制参数的要求
从你的终端上
我们现在唯一的输入就是键盘
从键盘上把数据送到
你这个地址参数里边
所指定的内存空间里边去
比如说这句话
什么意思
是取a的地址
取出来a的地址
按%d
把你敲进来的那个数据
按整型数的格式送进去
如果你敲得不是整型数
只取整数部分
送到a里边去
所以
我们看这句话scanf执行完了
内存里的变化是什么
它的结果是把5送到a里边
内存的a里边
把8送在内存的变量b
实现了这样的一个功能
那我们
看一下大家熟悉的这个例子
在这个例子里边
scanf
通过scanf
这个函数实现交互输入
交互输入就是什么
我们总是执行程序时候会看见
光标在那闪闪闪
那是谁的功能 scanf的功能
在闪着等你提示你输入
几个数 几个呢
是看你这要几个要几个变量
我要一个你给一个就够了
你要三个 你的把三个都输入完
输入不完它一直会在哪闪闪闪
我们现在要一个百分号d
为什么 是因为int r
所以这是一个整形数
我们就按整型格式输入
我们在scanf里边
通常有几个要注意的地方
就是大多数情况
跟printf是一样的
这几个要注意的地方是什么
第一个就说
在输入的时候
不允许指定精度
什么叫精度
不如说f格式里面我们平常说
六点二几点几
那个点几是说我小数位要几位
这在输入的时候是不允许的
但是可以指定域
比如说我整型数
我说我要3位
我实型数要8位
这个8位指的是什么
是连小数再小数点再整数
一共是八位
这样的话有什么好处
输入时侯你把数字一串输入
程序是自动的按你说的那个域截取
把第一个部分给了第一个变量
把第二部分给了第二个变量
比如说
3d那我现在说的a里面我取3位
送到a里边
而8.2这就不可以了
谁不可以点二不可以
不允许指定精度
你指定了精度边域就通不过
那你如果你说8
可不可以 可以
说我x里边一共要8位
要八位
到底要的是整型数
还是实型数 那你看你输入
你输入的东西它截取这个8位
所以这个格式是不可以的
上面的域是可以的
这是第一个
第二个大家要注意的是
我输入的这个数据什么时候结束
有这么几种情况都能结束
一个是你连着一串输入
如果也有域
别说我这个没有点二是八
前面是三那我需要输入十一位
它把自动前面取三位给了a
后面的八位给了x
它自动取
那么如果你不是这样子
你可以这样
你输入了一个整型数
你不是三位是一位回车
那它就取一位
第二个不是八位是五位
你回车 回车结束
或者不是回车是空格
也可以结束
还有我们刚才说宽度
自动它按你说的域去截取
还有一个
你随便输入了一个什么数
不符合条件的数
也能够结束
但是通常我们不提倡这样
通常我们是要不就回车
要不就是一个空格
要不就是你按你的宽度截取
我们看一下比如说这个
你现在呢
对这样的一个你取了3d
即输入了123456789
计算机自动截取了一个123给了k
剩下的就扔掉了
我们对这样的一个程序里边
大家看一下
我们int a float b和c
然后我这个scanf给abc取值
我去输出这里边的东西
假如说我的输入现在是这样子
我也没给回车
也没给空格
那它现在
这个abc里边
你要取 取了地址
把你送的scanf
把你从键盘上敲的这些数送进去
取得是多少
我们看
你是两d
那它取了1 2给了a
你下边是3f
那它取了3 4 5给了b
当然说这不成整型了吗
你放心它把这个3 4 5
搁到一个实型变量里
它的小数位
自动给取了
你要输出看的话它自动就是0
你下边4f
它应该取的是6 7 8 9给了c
剩下的就扔掉了
那么这个结果
输出的结果
a里边你看见的是1 2
b里边是3 4 5
是三位整数
后边的自动给你输出六位
小数位是0
后边6 7 8 9点这样子
我们来看一下这个程序
在这里边我们说a b c
a是整型b c是实型
我们分别给的这个域的宽度是
2对着整型
3和4对着两个实型数
然后我们分别把它输出
输出的时候我们都没有指定域
你设定abc里边是什么
你就把那东西原封不动拿出来
我们运行一下看看
我们输入随便敲几个数
看它的自动截取
是怎么截取的给长一点
前面是123456789
看一下
它截取的把1 2给了a
3 4 5给了b
是因为我们要的格式是f型
6 7 8是四位
b是三位
c是四位
a是两位
回去再看一下
两位整型的
三位四位两个实型数
关于动态交互的问题
实际上我们通常
还有一个非常常用的一个需求
就是字符的输入和输出
不是数值是字符
因为它用的频繁
所以c给了几个专门的函数
用来支持单个字符的输入和输出
我们先看
字符输入的函数
有这三个
getchar()
getch()
getche()
getchar()
这三个其实很相像
它起的作用
都是从键盘上输入一个字符
说明这么几点
每一次调用你只能输入一个字符
你可以输入三个但是不起作用
输入一个字符
然后另外一个
这个函数后边你要加上一个分号
它就是单独的一个语句
不加分号
你就可以把这个放在
一个表达式里边
加上一个分号
就可以单独成为一个语句
这是输入函数
接下来我们看一下输出函数
跟它非常像
putchar()
但是唯一不同的是什么
括弧里边有参数
这个参数是什么
可以是一个字符常量
也可以是一个字符变量
那它putchar谁
这个变量里边存着的那个字符
你这个变量里边必须是字符
你不能是一个实型数
搁在实型的变量
是一个字符变量
那它就是说
在你标准的输出设备就是屏幕上
把你指定的这个变量里的内容
显示出来
跟刚才的输入函数是一样的
字符数是一样的
一次只输出一个字符
然后加上分号以后
它就是一个独立的输出
就可以独立使用作为一个语句
我们看一下程序
在这里边我们看一下
char c1 c2 c3
字符型的
然后
我们给这个c1里边是getch()
然后
我们把c1输出
我们把c1输出
后边这个是什么意思
我们给了一个标记说
这是第一次输出
然后我给c2里边
在getche()
这两个区别是什么
都是从键盘上敲一个字符
只是说这个
你看不见你敲的那个字符
而这个是你能看见你敲的字符
这两个都不用回车
然后我把它输出看一下
第二次的那个
我第三次的那个
用的是getchar()
是说你敲的那个字符
也能看见
并且你需要回车
回车以后
你才能够put出它的内容来
我们去运行一下这个程序看一下
这几个get和几个putchar
是什么意思
我输入的第一个字符是a
它的确显示了
大家看这是
getch的作用
还是putchar的作用
应该是那个putchar的作用
我再给一个b
它出来了两个b
瞬间出来我敲了一个键
它出来了两个b
这是getche的作用
第二个是putchar的作用
我再给第三个c
它现在光标在这闪
闪等什么
等我回车
它执行那个putchar
回来看一下这个程序是不是这样
第一个输入它不显示
但是putchar显示
第二个输入它显示
同时显示了putchar(c2)
第三个getchar
它光标就停在那后面闪
等你回车
回车以后它才输出
我们再看一遍
我这下子给的1
这是第一个
其实是putchar的作用
光标现在闪的等着第二个
getche我给2
这同时出来两个2
第一个是getche的2
然后是putchar
putcha(c2)
再给了3
这是第三次了等我回车
它输出那个3
这就是几个输入输出函数
输出都是putchar
输入是分了三个
其实这三个差别不大
大家平常根据需要再去使用
-1.1 计算机的问题求解方法
--讨论题:数学模型
-1.1 计算机的问题求解方法--作业
-1.2 C语言与C程序
--讨论题:运算符
-1.3 C语言处理系统与程序调试运行
--例程
-1.4 程序中的人机交互
--例程
--作业讨论区
-2.1 算术运算的C程序实现
--算术混合运算.c
-2.1 算术运算的C程序实现--作业
-2.2 关系运算的C程序实现
--bukao.c
--字符比较.c
--讨论题:比较大小
-2.2 关系运算的C程序实现--作业
-第二周作业--作业
-2.3 逻辑运算的C程序实现
--计算结合性
--闰年.c
--自动购票问题.c
-2.3 逻辑运算的C程序实现--作业
-2.4 位运算的C程序实现
--讨论题:位运算
-2.5 几种很个别的运算
--讨论题
--讨论题
-2.5 几种很个别的运算--作业
-2.6 混合运算及数据类型转换
--讨论题:数据类型
-2.7 顺序结构程序实例
--Video
--三角形面积.c
--讨论题:工业产值
-2.7 顺序结构程序实例--作业
-3.1 程序中的路径选择实现
--打印学生成绩.c
--一元二次方程.c
-3.1 程序中的路径选择实现--作业
-3.2 路径中的再选择——嵌套判断
--例程
--讨论题:程序改错
-3.2 路径中的再选择——嵌套判断--作业
-3.3 复杂判断问题的C程序设计
--3.3 多级选择
--银行存款.c
--讨论题:多级选择
-3.4 多分支问题的C程序设计
--加减乘除运算.c
-3.4 多分支问题的C程序设计--作业
-3.5 GOTO的适当使用
-3.6 选择结构的程序实例
--3.6 程序展示
--计算第几天.c
--讨论题:输出奇数
--讨论题:计算税金
-3.6 选择结构的程序实例--作业
-第四周作业--作业
-4.1 需要重复执行的程序
--求和.c
--打印学生成绩.c
--统计录入速度.c
--求平均数.c
-4.1 需要重复执行的程序--作业
-4.2 至少要执行一次的循环
--n的阶乘.c
--字符分类统计.c
-4.2 至少要执行一次的循环--作业
-4.3 已知循环次数用for语句
--求和问题.c
--数列求和.c
--讨论题:循环语句
-4.3 已知循环次数用for语句--作业
-4.4 循环控制——简单循环应用
--水仙花数.c
--讨论题:死循环
--讨论题:猜数字
-循环结构的程序设计(一)--4.4 循环控制——简单循环应用
-4.5 循环的嵌套
--讨论题:程序运行
-4.5 循环的嵌套--作业
-4.6 break与continue
--最大素数.c
-4.6 break与continue--作业
-4.7 循环的综合应用
--数的排列组合.c
--鸡兔同笼.c
--打印空心字符.c
--讨论题:打印图形
--讨论题:计算闰年
-第六周作业
-第六周作业--作业
-5.1 同类有序数据处理问题
-5.2 一维数组的定义和引用
--数组定义.c
--数组初始化.c
--反向输出.c
--讨论题:对称数
-5.2 一维数组的定义和引用--作业
-5.3 一维字符串数组
--讨论题:编程
-5.4 字符串处理函数
--字符串反向.c
--字符串函数
-5.5 二维数组的定义与使用
-5.6 二维数组的输入输出
-5.6 二维数组的输入输出--作业
-5.7 二维数组的应用
--转置矩阵.c
--讨论题:修改程序
-5.8 二维字符数组
--5.8 单词排序
--单词排序.c
-5.8 二维字符数组--作业
-5.9 数组综合应用
--统计成绩.c
--统计字符次数.c
--讨论题:洗牌
-本期课程结束语
--end
-第八周编程作业
-《C语言程序设计(上)》期末复习参考
--html
-《C语言程序设计(上)》期末复习参考答案
--html