如何确保获取的输入为整数-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() 函数总是返回一个字符串. 例如 ...
随机推荐
- Vue后台管理项目中解决需要配置多个端口号问题
背景 登录接口:http://39.98.123.211:8170/ 商品接口:http://39.98.123.211:8510/ 可见前面是地址是一致的,但是端口号不一样. 这就会导致,登录进得去 ...
- using Spire.Pdf 合并文件夹下.pdf 文件
using Spire.Pdf private void mergePDF() { List<string> filesList = new List<string>(); D ...
- 第八章:diff
1.git diff命令的格式 1]可以使用git diff命令的来源,(任意树对象.工作目录.索引) 2]git diff命令进行树比较时,可以通过(提交名.分支名.标签名) 3]git d ...
- CentOS网络服务操作命令
CentOS 重启网络服务,输入下面的命令:systemctl retart network.service 或 systemctl restart network.CentOS 启动网络服务,输入下 ...
- ESP8266-01S 烧录AT固件
首先就是下载官网的下载软件和AT固件 这是下载好了的 然后就是硬件电路了 我是想把ESP8266用于Ardiuno板子的,然后网上有说买的USBTOTTL的3v3供电不够,所以我就用的Ardiuno板 ...
- MarkDown学习笔记1
# MarkDown学习(一级标题)## 标题(二级)### 三级标题#### 四级标题## 字体*Hello,World!斜体***Hello,World!加粗*****Hello,World!加粗 ...
- vue的易错点合集
关于vue的操作,可以借鉴到一些Ajax的方法和思路,但是因为语法的不一样,所以易错点多在语法. 第一步要引用相对的方法 div的id名称应该与下文的el名称一致 挂载方法created,相当于aja ...
- Qt实现collapsePanel(折叠)功能
实践过程中,看到C#实现的CollapsePanel功能,比一般的TabWidget更加直观,充分利用了页面空间,遂感到很有兴趣,也查阅了很多资料搜索Qt在这方面的实现. 目前来说,比较常见的作法就是 ...
- libevent学习之入门--[02]从hello-world开始
系列文章回顾 libevent学习之入门--[01]概述与安装 上一节介绍了libevent的下载和编译,从这节开始,我会从我学习的角度逐步探索libevent的源码,慢慢揭开它的神秘面纱. 面对几十 ...
- pycharm的安装与使用
官网下载最新版本,然后用激活码,激活,注意是专业版. 方法找到后更新在这里. 进入软件之后创建新的文件夹,可以自定义,建议自定义在系统盘以外, 1.新建文件略过 2.ctrl + 鼠标中键, 调节字体 ...