这一篇探讨的是如何确保你输入的数据是一个整数。虽然标题用的是这个,但我其实真正想要探讨的内容是 “在程序调试的过程中,需要注意把输入缓存区中的上一次输入的残留信息清理干净,以免影响下一次的输入。” 但由于这个内容太过于冷门,且不迎合人们利用搜索引擎查找问题时关键字的搜索。所以不太适合用于做标题,于是便利用了文章中例子所实现的功能来作为标题。属于c语言基础篇。


本来是想要把代码改成精简版直接用来说明的,但是在精简代码的过程中,觉得这个代码精简的过程挺重要的,所以想要单独的废话一两句(建议编程小清新看一下,大佬的话感兴趣可以审阅一下也可以直接跳过)。

对于编程这件事情,同一个需求,一百个人可能有一百篇不一样的代码。虽然都可以实现功能,但有些人的代码跑起来就是比别人的代码效率高。同样效率的代码,有些人的代码对于内存的占用,就是比别人的小很多。当然,在编程这件事上面,时间和空间不可兼得(一个很简单的例子就是全局变量,全局变量是一个很方便效率很高的东西,代码编程的过程中合理的使用全局变量,可以有效的提高程序的运行效率。但同时你也要清楚,全局变量是与程序共存亡的,也就是说整个程序的运行阶段都需要分配一块内存来存储这个变量,这其实是在用空间的占用来换取时间的快速)。所以一个好的程序,往往是能在时间和空间上面找到合理平衡点的程序。

个人认为一个程序员对于程序的追求应该有三个阶段。

第一个阶段是程序代码的精简,

第二个阶段是在第一个阶段的基础上提升程序的效率。

第三个阶段是在第二个阶段的基础上压缩程序的空间。

很惭愧的说,本人现在还在第一个阶段中挣扎徘徊。


好了,步入正题,这里我用的例子功能为——从键盘接收一个整数,将其转换成其ASCIL码值所对应的字符输出(就是用序号查ASCIL码表)

想要实现这个需求的话,我们先分析一下整体思路,这是我老师教我的。虽然我挺不喜欢这个环节的,每次听老师讲思路分析都会犯困,我倒是挺喜欢直接看代码的。但有时对于一些比较复杂的问题,如果不冷静下来捋一下思路,常常又会无从下手。

在这个例子里面,我们的思路很明确,既然需要把一个输入的整数转换为ASCIL码数值,那么我们首先需要从键盘接收一个整数,这里用的是scanf()函数来接收键盘数据,然后通过返回值来判断是否读取到了需要的数据。而 scanf() 函数的返回值有两种可能,要么返回接收到的数据个数,要么返回0。

利用 scanf() 函数本身的特性,这一步只有当输入数据的第一个是整型的时候, scanf() 函数的返回值才是1,否则就会返回0。这已经可以断绝掉输入的数据不是整型的可能了。


那是不是说只要我判断一下返回值是否等于1就可结束任务呢?如果我同时输入两个整形数据呢?

当然,在这个程序里面是没有问题的,因为这个程序只要接收到了第一个整形数据后,便会退出循环,结束程序。由于程序已经死掉了,后面输入的内容便会跟着程序一起被系统释放掉。

但是如果你的程序很大很大,在这里接收了用户输入后,后面也还要接收用户的输入,这里就会出现问题了。由于你在这边连续输入了多个数据,且第一个是整形,程序运行到这里的时候,仅仅只读取了第一个整型数据,而后面的残留数据被留在了缓存区,在程序下一次读取键盘数据的时候,这些残留数据就会被错误输入到程序中,就有可能导致程序出现错误。


那么既然我们意识到了同时输入多个数据可能会造成程序的意外错误,那么在这里我们就不能简单的判断scanf的返回值是否等于1了事,在程序得到了这个数据后还要判断一下这个数据后面是否还有别的数据。判断过程在代码中体现。

最后就是处理好判断的结果就行了,如果读取正常要怎么处理,如果读取不正常又要怎么处理。


Created with Raphaël 2.2.0开始scanf()接收输入判断输入是否合法转换类型输出结束清空缓存区yesno

好了先看原版代码。

#include <stdio.h>
int main(void)
{
int pw;//这个变量是用来接受输入的
int i;//临时变量,存储返回值用于判断
while(1)
{
i = scanf("%d", &pw);
//这一步就是判断输入的数据是否合法,且输入的仅仅是一个整数
if(i == 1 && getchar() == '\n')
break;
else
{
// 温馨提示一下
if(i == 1)
printf("请仅输入一个整数!\n");
else
printf("你输入的不是整数,请再来一遍!\n"); //这一步就是将缓存区中的非法格式数据拿掉的一步了
while(1)//清空缓存区
{
char c = getchar();
if(c == '\n')
break;
}
}
}
printf("你输入的数值转为字符为:%c\n", (char)pw);
return 0;
}

以下是精简版的代码。

#include <stdio.h>
int main(void)
{
int pw;//这个变量是用来接受输入的
//这一步就是判断输入的数据是否合法,且输入的仅仅是一个整数
while(!(scanf("%d", &pw) && getchar() == '\n'))
{
while(getchar() != '\n');//清空缓存区
printf("你输入的数据有误,请再输一遍!\n");//温馨提醒一下
}
printf("你输入的数值转为字符为:%c\n", (char)pw);
return 0;
}

由于是第一篇博客还不太擅长组织文章的结构和对于语言的表达,原谅我把如此简单的问题复杂的扯了这么一大篇。

原博客始发于CSDN,在如今博客界的转载抄袭泛滥的环境下,原创不易,点个赞再走呗。以下是博客首页的链接。


零BUG是原则性问题。

如何确保获取的输入为整数-C语言基础的更多相关文章

  1. 程序设计入门-C语言基础知识-翁恺-第一周:简单的计算程序-详细笔记(一)

    目录 第一周:简单的计算程序 1.1 第一个程序 Hello World! 1.2 变量 1.3 计算 1.4 编程作业及课后讨论 第一周:简单的计算程序 1.1 第一个程序 Hello World! ...

  2. 【C语言】输入一个整数N,求N以内的素数之和

    [C语言]输入一个整数N,求N以内的素数之和 /* ========================================================================== ...

  3. 【C语言】输入一组整数,求出这组数字子序列和中最大值

    //输入一组整数.求出这组数字子序列和中最大值 #include <stdio.h> int MAxSum(int arr[],int len) { int maxsum = 0; int ...

  4. Python从菜鸟到高手(6):获取用户输入、函数与注释

    1. 获取用户输入   要编写一个有实际价值的程序,就需要与用户交互.当然,与用户交互有很多方法,例如,GUI(图形用户接口)就是一种非常好的与用户交互的方式,不过我们先不讨论GUI的交互方式,本节会 ...

  5. Go 获取键盘输入,进制转换

    #### Go 获取键盘输入,进制转换 最近爱上<<珂矣的心灵独语>> 连续听一下礼拜也不觉得厌: 喜欢她的宁静与安然,喜欢她的坦荡与欢喜,喜欢她的禅意与智慧; ***撑着一苇 ...

  6. Java用Scanner类获取用户输入

    用Java编写程序时,有些数据需要用户输入,这个时候需要调用java提供的Scanner类,这个类在包java.util下,比如求一个矩形的面积,简单的看一下用法: import java.util. ...

  7. JAVA中获取键盘输入的方法总结

    Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!下面介绍三种解决方法: 方法一: ...

  8. Java入门:基础算法之获取用户输入

    本部分演示如何获取用户输入.我们使用Scanner类来得到用户输入.下面的实例代码中演示了如何获取用户输入的字符串.整数和float数据.主要用到了以下方法: 1)public String next ...

  9. Java基础 - 获取键盘输入

    package com.demo3; import java.util.Scanner; /* * 使用 Scanner 获取键盘输入供程序使用 * * 使用步骤: * A:导包 * import j ...

  10. 16.Python input()函数:获取用户输入的字符串

    input() 函数用于向用户生成一条提示,然后获取用户输入的内容.由于 input() 函数总会将用户输入的内容放入字符串中,因此用户可以输入任何内容,input() 函数总是返回一个字符串. 例如 ...

随机推荐

  1. JS回文检查(FreeCodeCamp项目)

    需求 如果传入的字符串是回文字符串,则返回 true. 否则返回 false 回文 palindrome,指在忽略标点符号.大小写和空格的前提下,正着读和反着读一模一样. 注意:检查回文时,你需要先去 ...

  2. wait notify 实例,生产消费者模式(转)

    今天发现了一段很标准的多线程代码,记得以前也写过,但是没有这个这么小巧和标准. import java.util.LinkedList; import java.util.Queue; import ...

  3. apt-get update 报错 Repository ' InRelease' changed its 'Suite' value from 'stable' to 'oldstable'

    问题截图: 解决方案: apt-get update --allow-releaseinfo-change

  4. R6-2 二分查找

    R6-2 二分查找 分数 15 全屏浏览题目 切换布局 作者 张泳 单位 浙大城市学院 已有一个10个元素的整形数组a,且按值从小到大有序.输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标 ...

  5. 如何在Debian10镜像中设置Nginx引擎模块

    目前,我们较多的服务器WEB环境都是用的Nginx引擎,我们采用服务器的目的是可以获取到更多的资源,而且建站数量是不受限制的.我们可以根据自己需要配置Nginx,可以自定义特定域的设置,允许您在单个服 ...

  6. recastnavigation计算三角形离给定点最近位置方法简单注释

    三角形 在recastnavigation中,三角形是最基础的元素,很多逻辑都是基于三角形进行的,其中比较常见的一个操作就是计算指定点到某三角形上的最近距离.由于三角形通常代表行走面,而给定点P可能是 ...

  7. 为什么常用Formdata对象来上传图片

    一.上传的数据体格式Content-Type 1.application/x-www-form-urlencoded 2.application/json 3.multipart/form-data ...

  8. ORihard KCU116E: 经济实惠的 100Gbps 网络和存储 FPGA 开发平台

    ORihard KCU116E: 经济实惠的 100Gbps 网络和存储 FPGA 开发平台   ORihard KCU116E: 经济实惠的 100Gbps 网络和存储 FPGA 开发平台 Kint ...

  9. Java数组之数组的使用

    数组的使用 普通的for循环 For-Each循环 数组作方法入参 数组作返回值 public class ArrayDemo03 { public static void main(String[] ...

  10. mysql使用保留字导致该列查不出来(mysql版本问题)

    mysql版本是 问题: 如图这边groups是sql的保留字此时这样查询是查不出来的,并会报错语法错误.但是在5.几的mysql版本中这行sql就没有问题. 解决方法: 在groups列上加上'gr ...