如何确保获取的输入为整数-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() 函数总是返回一个字符串. 例如 ...
随机推荐
- SourceInsight中inc文件中的符号不能同步问题
解决方法: 打开Options->Preferences->Syntax Formatting->File Types,然后选中对应的开发语言,如C/C++ Source File, ...
- Devexpress WPF ChartControl 多Y轴
<Window x:Class="DXApplication4.MainWindow" xmlns="http://schemas.microsoft.com/wi ...
- span服务器控件
Label Button 这些控件在服务器端都有对应的类可以去实例化一个对象, 可是像 span 这些在服务器没有对应的类可实例的, 在服务器端要实例化一个 span 控件时怎么办呢? 可以使用 Ht ...
- python下载文件headers
from aiohttp import webfrom urllib.parse import quote r = web.Response()# r.content_type = 'applicat ...
- pycharm 默认添加# -*-coding: utf-8 -*-
备忘 pycharm创建py文件时,默认输入表头信息 1.点击[File]-[Settins] 2.点击[Editor]-[File and Code Templates] 3.点击[Python S ...
- Unity异步加载场景与加载进度条
先上效果图 需要三个场景 1,2, 3 从场景1跳转到场景3,场景2是加载场景 场景1按钮的代码如下 using System.Collections; using System.Collection ...
- 点击div实现选中效果
先上一份效果图.原来的checked多选框还是存在的,我只不过隐藏了,让他的整个div的范围都是可以点击的,右上角三个点是可以删除当前元素,左下角的播放按钮可以点击播放语音,主要是利用z-index把 ...
- Java集合-LinkedHashSet
LinkedHashSet 重点: LinkedHashSet 不允许重复元素,与 HashSet的区别是:它是有序的 LinkedHashSet 底层结构是 数组table + 双向链表 [介绍] ...
- React整洁的代码的一些原则
1. Model is everything models are the heart of your app. If you have models separated from th rest ...
- js操作网页元素
二.操作网页元素 1.查找网页元素 给标签设置id属性,一个网页中id的值不能出现重复的 <button id="btn">按钮</button> 2.给按 ...