解析:
程序中有两行 scanf 函数 , 运行时只有 1 次输入的原因:
当 scanf 的格式为 %c 时 , scanf 函数仅从标准输入缓冲区中读取一个单一的字符;而当 scanf 的格式为 %d 时 , scanf 函数将读取输入的一整串十进制整数 。
取消注释后 , 仅当程序运行至第 8 行时输入一串十进制数字 , 之后再无输入而直接结束程序 。因为当输入 123 并键入回车后 , 第 8 行 scanf 函数以 %d 格式读取标准输入缓冲区中的串 123\n 并打印 123 。当程序运行至第 10 行时 , scanf 函数以 %c 格式直接读取标准输出缓冲区中的 \n , 由于已经获得行缓冲中执行 I/O 时需要的回车(\n) , 程序直接运行第 11 行进行打印;倘若第 10 行 scanf 函数以 %d 或 %f 格式读取标准输入缓冲区 , 由于 \n 不属于 1~9 之间的十进制数或小数点 , 标准输入缓冲区中的 \n 将被 scanf 函数忽略或删除(若缓冲区内存在空格同理) 。此时程序暂停 , 需要再次将字符输入标准输入缓冲区才能继续运行 。
可在 9-10 行之间插入 (stdin);(2017 与 2019 版本)或 (stdin);(更早的版本)清除缓冲区 。scanf 函数参数中 , 第一个 “,” 后的参数为存储地址 , 必须使用取址符 & , 否则会产生参数类型的报错 。因为 scanf 函数是将数据存放在变量的存储地址上的 , 若未加入 & , 编译器检测到的将会是一个未初始化的值 。另外 , 在未加入 & 的前提下给变量赋值会产生访问冲突报错 , 相当于更改赋值数对应地址的内容 。
注: 与的区别:
性质
操作符
库函数
参数
数据的类型或变量
结尾为 \0 的字符串
计算结果
在编译时计算结果
在运行是计算结果
计算方式
计算数据类型占内存的大小
计算字符串实际长度
参考:和的区别 - 徒梦 - 博客园
2.9.2 scanf 函数的循环读取
例:使用 while 语句实现 scanf 函数的循环读取
输出:
数据类型输入输出
int
123
123
char
float
不断打印1
解析:
2.9.3 多种数据类型混合输入
例:混合输入整型、字符型与浮点型数据
输出(输入 100 a 1.1):
程序不断打印 i=100,c= ,f=-. 。
解析:
当程序运行至第 11 行之前 , 各个变量内存状态如下:
此时 ret=2 , 意味着有两个参数成功获得返回值 。对照各个参数的实际内容 , 获得返回值的为变量 i 与变量 c , 变量 f 仍为初始化值 。
查看内存 , 100 被成功赋值给变量 i(对应 ASCII 码为字符 d) , 而赋给变量 c 的是一个空格 。
猜测是输入的 100 与 a 之间的空格被赋值给变量 c 。更改 1 ^{1} 1代码第 9 行如下:
一般只需在 %c 前加入空格即可 。
如果你使用的是 scanf 函数那么不出意外问题已经解决 , 但是使用函数的朋友们会发现运行后发生程序异常:
同时 , 变量 f 内存中仍为初始化值 , 变量 c 的内存中成功出现字符 a 。但之后出现一串内存的哀嚎 , 参考C语言()函数的用法 , 猜测是未定义函数的字符读取长度而出现的函数越界读取 。
更改 2 ^{2} 2代码第 9 行如下:
输出:
若需要限制浮点数输出位数 , 可在 % 与 f 之间输入限制的大小 , 如 %5.2f 。
未解之谜: \{}{未解之谜:} 未解之谜:?
设定字符c读取长度之前 , 输入的浮点型数1.1去哪了? \{}{设定字符 c 读取长度之前 , 输入的浮点型数 1.1 去哪了?} 设定字符c读取长度之前 , 输入的浮点型数1.1去哪了??定义变量时 , int i; 的位置在 char c; 之前 , 而运行后发现变量 i 的位置在变量 c 之后的原因?
- 第四步:使用命令“net user ahl$ 123456 /add”创建隐藏账
- 密码攻陷及保护 第四篇:sparta工具的使用
- 在Ubuntu18.04使用搜狗输入法
- Hive求截止到当前日期累计消费金额或使用次数
- python的excel函数_利用python在excel里面直接使用sql函数
- java设计模式种strategy模式简述与使用
- source insight 宏进阶功能
- Nant使用简介
- 用GitHub Copilot在Vs Code里快速写代码,最详细使用教程
- Mac环境下 docker的安装与使用