在使用scanf的时候,因为需要传递整数,所以,很显然格式化字符串使用“%d”,但是在测试的时候,有人就使用了小数,也就是误输入,那情况就糟糕了,举一个简单的例子:

#include <stdio.h>
int main()
{
int a,b,c;
//printf("a=%d,b=%d,c=%d\n",a,b,c);
while(1)
{
//fflush(stdin);
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
printf("---------------\n");
}
return 0;
}

如果输入三个正确的正整数的话,那么程序运行正常,例如输入 1,2,3,那么运行的结果就是
1 2 3
a=1,b=2,c=3
---------------
但是,如果不慎输入小数的话,那么整个程序就会崩溃的,因为显示的太快了,于是我修改了一下程序,让程序在下一个while循环的时候,休眠了两秒钟,如下:

#include <stdio.h>
#include <windows.h>
int main()
{
int a,b,c;
//printf("a=%d,b=%d,c=%d\n",a,b,c);
while(1)
{
//fflush(stdin);
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
printf("---------------\n");
Sleep(2000);
}
return 0;
}

下面的假设我误输入了小数,看一下情况会怎么样:
2.3
a=2,b=-858993460,c=-858993460
---------------
a=2,b=-858993460,c=-858993460
---------------
a=2,b=-858993460,c=-858993460
---------------

程序一直死循环我们可以看到a的值是2,而b和c的值都是随机值,然后通过通过在使用之前输出a,b,c值,如下:
printf("a=%d,b=%d,c=%d\n",a,b,c);
输出结果:
a=-858993460,b=-858993460,c=-858993460
可以看到每次循环的时候,它们的值都没有发变化。想到了scanf的使用,我猜想一直死循环的原因就是scanf对输入变量的记忆,如果把内存清空的话,是不是就不会发生类似的情况了呢?
于是,我在while循环的最开始添加了语句fflush(stdin);然后运行:
即使第一次输入小数的时候,程序也不会崩溃。运行如下:
a=-858993460,b=-858993460,c=-858993460
4.2
a=4,b=-858993460,c=-858993460
---------------
1 2 3
a=1,b=2,c=3
---------------
.5
a=1,b=2,c=3
---------------
虽然没有崩溃,但是,我们看到最后输入“.5”的时候,a,b,c的值都没有发生变化。
那如何在程序中识别这种情况呢?同桌给我了下面的一个程序:

#include<stdio.h>
int main()
{
int x,y;
printf("num3:%d\n",x);
while((y=scanf("%d",&x))==1)
{
printf("num1:%d\n",x);
printf("num2:%d\n",y);
}
printf("num3:%d\n",x);
printf("num3:%d\n",y);
return 0;
}

下面是运行过程:
运行一:
x=-858993460
4
num1:4 --正常执行
num2:1 --scnaf的返回值表示成功读入变量的个数,该程序返回1表示读取正常
4.2
num1:4
num2:1 --当输入小数的时候,第一次读取的时候,读取的是整数部分,通过返回的1可以看出来,变量赋值正确
num3:4 --但是,为什么,它又退出程序了呢,而且第二次的返回值竟然是0,也就是赋值失败,我只是输入一个值
num4:0
Press any key to continue
运行2:
x=-858993460
.2
num3:-858993460 --当值输入一个小数的时候,我们可以看到,其实变量x并没有赋值,还是原来产生的那个随机值
num4:0
Press any key to continue

通过上面的例子,我们可以看到,当我们通过scanf的时候,如果参数列表是“%d”,但是在运行的时候输入的是小数的话,那么第一次变量获取的是小数点前面的部分,如果小数点前面有整数的话,那么scanf就可以正常读取输入的值。但是,倘若我们接下来还有一个scanf的话,那么该scanf就会去取输入的小数去掉整数的部分,例如,当输入“3.2”的时候,第一次读取的是3,第二个scanf函数就不会读取你输入内容,而是会接受内存中没有读取的“.2”,这个时候,我们的变量就不会得到新的值,如果该变量(例如上面的x)原来赋值的话(获取小数4.2的整数部分4),那么它还是4,如果没有赋值的话,它还是原来的随机值,也就是,该变量中的值并没有更新。其实避免影响第二次scanf的方法就是在执行第二个scanf的之前,清空内存,例如使用“fflush(stdin);”
如果把它放到了while循环的最后,例如去掉源程序中注释的内容,重新编辑运行:
x=-858993460
2
num1:2 --整数正常
num2:1
5.6
num1:5 --小数获取整数部分
num2:1 --正常
.2
num3:5 --变量的值并没有重新写入
num4:0 --读取新值失败,退出
Press any key to continue
从运行的结果可以看出,只要第一次输入的内容不是以小数点开头的话,那么就可以继续运行下去。
那么在自己的程序中怎么预防这样的问题呢?
下面通过一个小例子来说明一下:

#include <stdio.h>
void main()
{
int num,ret;
while ((ret=scanf("%d",&num))!=1)
{
printf("输入错误,请重新输入:");
fflush(stdin);
continue;
}
printf("你输入的值是:%d,下面就可以使用了!\n",num);
}

运行情况如下:
.2     --输入的整数误输入多一个小数点
输入错误,请重新输入:2  --提示重新输入
你输入的值是:2,下面就可以使用了!
Press any key to continue

3.6    --输入了小数
你输入的值是:3,下面就可以使用了!--可以正确读取其中的整数部分
Press any key to continue

如果担心上面的误操作会影响下面的scanf操作,那么可以在使用该函数之前,使用“fflush(stdin);”清空一下内存。

希望可以对大家有所帮助,如果有什么不对的地方,还烦请指教,谢谢!

scnaf使用格式化字符串%d接受小数的情况相关推荐

  1. python format 格式化函数的用法 格式化字符串(保留小数{:.2f}、数字补零)

    引用文章:Python format 格式化函数

  2. 格式化字符串漏洞利用 五、爆破

    五.爆破 原文:Exploiting Format String Vulnerabilities 作者:scut@team-teso.net 译者:飞龙 日期:2001.9.1 版本:v1.2 当利用 ...

  3. 零基础入门学习Python(14)-格式化字符串

    什么是格式化字符串 格式化字符串就是按照统一的规格去输出一个字符串,如果规格不统一,就很可能造成误会 format()方法 接受位置参数和关键字参数两种参数 二者均传递到一个replacement的字 ...

  4. python转化为字符串格式_Python格式化字符串~转

    在编写程序的过程中,经常需要进行格式化输出,每次用每次查.干脆就在这里整理一下,以便索引. 格式化操作符(%) "%"是Python风格的字符串格式化操作符,非常类似C语言里的pr ...

  5. python 格式化字符串_Python格式化字符串常用操作

    前言 字符串的格式化.以及增.删.改.查.并.分,无论写什么程序都是一个非常重要的操作,熟练的使用可以让程序变得整洁,对于输出结果的格式能很好的统一性. 0 1 格式化字符串 在python的2.x版 ...

  6. 字符串原样输出程序python_Python格式化字符串(格式化输出)

    Python 提供了"%"对各种类型的数据进行格式化输出,例如如下代码: price = 108 print ("the book's price is %s" ...

  7. python实现中撤销上一步的代码mac_一个“MacBook”新手的Python“笨办法”自学之旅 #第六章:常用的简易Python命令、符号、代码、格式化字符串...

    第六章:常用的简易Python命令.符号.代码.字符串 <"笨办法"学Python>这本书中,确实用了较多篇幅来介绍Python的一些常用简单的命令.符号.代码和字符串 ...

  8. python中格式化字符串的使用_Python中的格式化字符串

    Python中的格式化字符串方法: 在学习了一段时间的Python之后,回过头来看书的时候,发现Python中最简单的关于格式化输出字符串的方法也有多种,而这并不是类似于茴香豆的"茴&quo ...

  9. Qt sprintf_s函数格式化字符串出错

    Qt sprintf_s函数格式化字符串出错 问题的出现: 我在VS上用c C++写的跨平台的函数 移植到Qt 上面 出现sprintf_s 函数格式化出错. 开始以为是编码问题  反复查找Qt乱码问 ...

  10. Python输出格式化 格式化字符串语法 format f-string 格式化操作符% 数据类型转换 对齐方式 转换标志字符

    Python输出格式化 格式化字符串语法 1.format 1.1 Format String Syntax 格式字符串语法 str.format() 方法和 Formatter 类共享相同的格式字符 ...

最新文章

  1. python如何跨模块调用变量_Python跨模块用户定义的全局变量:在其他模块运行时调用它们的问题...
  2. 基于IAR上搭建开发MM32的环境
  3. 对话框编程之非模态对话框 [04]
  4. Bit-Z CEO长顺入围2018中国经济潮流人物
  5. 1364: 开灯与关灯(深入思考问题更妙哦~~)
  6. cdh中使用hue使用教程_我可以在户外使用Philips Hue灯泡吗?
  7. 用python计算准确率_分词结果准确率、召回率计算-python(示例代码)
  8. 【Filebeat】windows下安装filebeat
  9. 德语课堂笔记 之 与食物相关的名词
  10. MLA 格式引用怎么做好分析?
  11. 企业移动应用—我有 开启移动营销的里程碑
  12. jsp两种注释格式的区别
  13. 分布式环境搭建之Redis安装及使用
  14. python中for循环的代码_Python中的九九乘法表(for循环)
  15. 小程序中关于红包雨的实现
  16. Python|使用PIL增强视频画质
  17. error processing condition on org.autoconfigure.transaction.TransactionAutoConfiguration$Transaction
  18. 中国人工晶状体行业运行态势分析及发展战略规划建议报告2022-2028年版
  19. 台式计算机型号是什么问题,台式电脑的型号一般写在哪里
  20. HART通讯协议及应用

热门文章

  1. Dubbo-Adaptive实现解析
  2. android修改渠道,Android 多渠道定制化打包
  3. Win7开自带的虚拟WIFI
  4. 编程实现库函数strcat
  5. 技术人,一定要保持一颗有空就学习的心。
  6. 认识c语言程序,认识C语言
  7. nav-tage、vue3.0顶部历史浏览记录代码实现 vuex + el + vue3.0
  8. WIN10下删除Hiberfil.sys文件
  9. Tomocat:安装完成,显示HTTP Status 404
  10. 浏览器网页怎么实现文档、小票自动静默打印?【深度】