如何确保获取的输入为整数-C语言基础

这一篇探讨的是如何确保你输入的数据是一个整数。虽然标题用的是这个,但我其实真正想要探讨的内容是 “在程序调试的过程中,需要注意把输入缓存区中的上一次输入的残留信息清理干净,以免影响下一次的输入。” 但由于这个内容太过于冷门,且不迎合人们利用搜索引擎查找问题时关键字的搜索。所以不太适合用于做标题,于是便利用了文章中例子所实现的功能来作为标题。属于c语言基础篇。
本来是想要把代码改成精简版直接用来说明的,但是在精简代码的过程中,觉得这个代码精简的过程挺重要的,所以想要单独的废话一两句(建议编程小清新看一下,大佬的话感兴趣可以审阅一下也可以直接跳过)。
对于编程这件事情,同一个需求,一百个人可能有一百篇不一样的代码。虽然都可以实现功能,但有些人的代码跑起来就是比别人的代码效率高。同样效率的代码,有些人的代码对于内存的占用,就是比别人的小很多。当然,在编程这件事上面,时间和空间不可兼得(一个很简单的例子就是全局变量,全局变量是一个很方便效率很高的东西,代码编程的过程中合理的使用全局变量,可以有效的提高程序的运行效率。但同时你也要清楚,全局变量是与程序共存亡的,也就是说整个程序的运行阶段都需要分配一块内存来存储这个变量,这其实是在用空间的占用来换取时间的快速)。所以一个好的程序,往往是能在时间和空间上面找到合理平衡点的程序。
个人认为一个程序员对于程序的追求应该有三个阶段。
第一个阶段是程序代码的精简,
第二个阶段是在第一个阶段的基础上提升程序的效率。
第三个阶段是在第二个阶段的基础上压缩程序的空间。
很惭愧的说,本人现在还在第一个阶段中挣扎徘徊。
好了,步入正题,这里我用的例子功能为——从键盘接收一个整数,将其转换成其ASCIL码值所对应的字符输出(就是用序号查ASCIL码表)。
想要实现这个需求的话,我们先分析一下整体思路,这是我老师教我的。虽然我挺不喜欢这个环节的,每次听老师讲思路分析都会犯困,我倒是挺喜欢直接看代码的。但有时对于一些比较复杂的问题,如果不冷静下来捋一下思路,常常又会无从下手。
在这个例子里面,我们的思路很明确,既然需要把一个输入的整数转换为ASCIL码数值,那么我们首先需要从键盘接收一个整数,这里用的是scanf()函数来接收键盘数据,然后通过返回值来判断是否读取到了需要的数据。而 scanf() 函数的返回值有两种可能,要么返回接收到的数据个数,要么返回0。
利用 scanf() 函数本身的特性,这一步只有当输入数据的第一个是整型的时候, scanf() 函数的返回值才是1,否则就会返回0。这已经可以断绝掉输入的数据不是整型的可能了。
那是不是说只要我判断一下返回值是否等于1就可结束任务呢?如果我同时输入两个整形数据呢?
当然,在这个程序里面是没有问题的,因为这个程序只要接收到了第一个整形数据后,便会退出循环,结束程序。由于程序已经死掉了,后面输入的内容便会跟着程序一起被系统释放掉。
但是如果你的程序很大很大,在这里接收了用户输入后,后面也还要接收用户的输入,这里就会出现问题了。由于你在这边连续输入了多个数据,且第一个是整形,程序运行到这里的时候,仅仅只读取了第一个整型数据,而后面的残留数据被留在了缓存区,在程序下一次读取键盘数据的时候,这些残留数据就会被错误输入到程序中,就有可能导致程序出现错误。
那么既然我们意识到了同时输入多个数据可能会造成程序的意外错误,那么在这里我们就不能简单的判断scanf的返回值是否等于1了事,在程序得到了这个数据后还要判断一下这个数据后面是否还有别的数据。判断过程在代码中体现。
最后就是处理好判断的结果就行了,如果读取正常要怎么处理,如果读取不正常又要怎么处理。
好了先看原版代码。
#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,在如今博客界的转载抄袭泛滥的环境下,原创不易,点个赞再走呗。以下是博客首页的链接。
如何确保获取的输入为整数-C语言基础的更多相关文章
- 程序设计入门-C语言基础知识-翁恺-第一周:简单的计算程序-详细笔记(一)
目录 第一周:简单的计算程序 1.1 第一个程序 Hello World! 1.2 变量 1.3 计算 1.4 编程作业及课后讨论 第一周:简单的计算程序 1.1 第一个程序 Hello World! ...
- 【C语言】输入一个整数N,求N以内的素数之和
[C语言]输入一个整数N,求N以内的素数之和 /* ========================================================================== ...
- 【C语言】输入一组整数,求出这组数字子序列和中最大值
//输入一组整数.求出这组数字子序列和中最大值 #include <stdio.h> int MAxSum(int arr[],int len) { int maxsum = 0; int ...
- Python从菜鸟到高手(6):获取用户输入、函数与注释
1. 获取用户输入 要编写一个有实际价值的程序,就需要与用户交互.当然,与用户交互有很多方法,例如,GUI(图形用户接口)就是一种非常好的与用户交互的方式,不过我们先不讨论GUI的交互方式,本节会 ...
- Go 获取键盘输入,进制转换
#### Go 获取键盘输入,进制转换 最近爱上<<珂矣的心灵独语>> 连续听一下礼拜也不觉得厌: 喜欢她的宁静与安然,喜欢她的坦荡与欢喜,喜欢她的禅意与智慧; ***撑着一苇 ...
- Java用Scanner类获取用户输入
用Java编写程序时,有些数据需要用户输入,这个时候需要调用java提供的Scanner类,这个类在包java.util下,比如求一个矩形的面积,简单的看一下用法: import java.util. ...
- JAVA中获取键盘输入的方法总结
Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!下面介绍三种解决方法: 方法一: ...
- Java入门:基础算法之获取用户输入
本部分演示如何获取用户输入.我们使用Scanner类来得到用户输入.下面的实例代码中演示了如何获取用户输入的字符串.整数和float数据.主要用到了以下方法: 1)public String next ...
- Java基础 - 获取键盘输入
package com.demo3; import java.util.Scanner; /* * 使用 Scanner 获取键盘输入供程序使用 * * 使用步骤: * A:导包 * import j ...
- 16.Python input()函数:获取用户输入的字符串
input() 函数用于向用户生成一条提示,然后获取用户输入的内容.由于 input() 函数总会将用户输入的内容放入字符串中,因此用户可以输入任何内容,input() 函数总是返回一个字符串. 例如 ...
随机推荐
- Oracle 存储过程2: PL/SQL数据类型
一.标量数据类型 标量数据类型的变量只有一个值,且内部没有分量.标量数据类型包括数字型,字符型,日期型和布尔型.这些类型有的是 Oracle SQL 中有的数据类型,有的是 PL/SQL 自身附加的数 ...
- ONOS-2.2在IntelliJ IDEA进入调试模式
转载https://blog.csdn.net/fsdgfsf/article/details/90369709 在ONOS2.2中使用IDEA打开并支持断点调试 1.让环境变量生效 . /etc/p ...
- 自定义类型与Qt元对象系统
个人发现一篇关于在Qt中使用元对象系统支持自定义类型的好博文,记录下防止丢失(如有侵权,烦请告知删除).博文原地址:http://qtdebug.com/qtbook-misc-qvariant/ Q ...
- string转JSONObject顺序不变和 往map放数据按顺序
JSONObject field = JSONObject.parseObject(fieldStr,Feature.OrderedField); Map<String,String> m ...
- while跟if循环
While(表达式)//循环,达成括号里的条件,一直循环执行里面的程序直到得出的值不成立后退出循环 { 循环体} 几个练习题: using System; namespace while练习2 { c ...
- 老生常谈:String s1 = new String("abc") 创建了几个字符串对象及8 种基本类型的包装类和常量池
将创建 1 或 2 个字符串.如果池中已存在字符串常量"abc",则只会在堆空间创建一个字符串常量"abc".如果池中没有字符串常量"abc" ...
- PAT-basic-1021 个位数统计 java
一.题目 给定一个 k 位整数 N=dk−110k−1+⋯+d1101+d0 (0≤di≤9, i=0,⋯,k−1, dk−1>0),请编写程序统计每种不同的个位数字出现的次数.例如: ...
- TypeScript 合并以及删除数组数据
1.添加 concat() 2.删除(替换) splice() array.splice(index,int,any) index 是 array数组起始位置的index(从0开始) int是操作从i ...
- 20192305 王梓全Python程序设计实验三报告
20192305 王梓全Python程序设计实验三报告 课程:<Python程序设计> 班级: 1923 姓名: 王梓全 学号:20192305 实验教师:王志强 实验日期:2021年5月 ...
- IDEA-mybatis逆向工程使用
首先我们需要安装mybatis逆向工程插件mybatis Generator: 然后在pom.xml文件中添加逆向工程插件: <!--mybatis逆向工程插件--> <plugin ...