C++控制台程序判断输入的数字
C++标准库中的iostream库的基础是用于表示输入流的istream类型和用于表示输出流的ostream类型。处理输出时使用ostream类型的对象cout,处理输入时使用istream类型的对象cin。
使用cin和输入操作符>>可以将输入的数据保存到变量中。有时要求输入的数据必须是数字,此时就需要在处理输入数据之前对其进行判断。
1 通过istream类的成员函数对输入数据进行判断
istream类的fail()函数可以判断从输入流中读取到的数据是否满足条件。通过该函数可以对输入的数据进行判断。
unsigned long num_input = 0;
cout << "请输入一个数:";
cin >> num_input;
string num_input_string;
while (cin.fail())
{
cin.clear();
cin >> num_input_string;
cout << "输入的"<< num_input_string<<"不是数字,请输入一个数:";
cin >> num_input;
}
其中,num_input 的类型是 unsigned long ,如果此时输入的不是数字,则 cin.fail() 函数的返回值是 true 。在 while() 循环中,首先调用 istream 类的成员函数 clear() 来清空错误标志,因为 cin.fail() 返回 true 时,会将输入流中的 failbit 位(错误标志位)置为 1 ,为了能够在后续的动作中正常接收输入数据,必须先通过 cin.clear() 将 failbit 位重新置 0 。接下来,通过 cin 和输入操作符 >> 将错误的输出保存在 string 类型的变量中,并且输出错误提示信息。最后,再次通过 cin 等待正确的输出,直到输入的数据为数字时,程序才会跳出 while() 语句。
以上代码执行的结果如图1所示。
图1 程序运行效果
2 通过自定义函数对输入数据进行判断
自定义函数的基本思想时,首先将输入保存在string类型中。接下来遍历string类型中的所有字符,只有所有的字符是数字时,才说明输入的数据时数字。
2.1 string类型
string类型包含在C++标准库中。该类型支持长度可变的字符串,在使用该类型时,必须包含头文件
#include <string>
2.2 自定义函数
由于输入的数字可能是正数,也可能是负数,所有在自定义函数中,要分这两种情况加进行判断。
bool is_number(string str)
{
if (str.c_str()[0] != 45)//45是负号,如果输入的是正数
{
for (int i = 0; i < str.length(); i++)
{
if (str.c_str()[i] < '0' || str.c_str()[i] > '9')
{
return false;
}
}
return true;
}
else//输入的是负数
{
for (int i = 1; i < str.length(); i++)
{
if (str.c_str()[i] < '0' || str.c_str()[i] > '9')
{
return false;
}
}
return true;
}
}
其中,自定义函数的参数str为已经保存为string类型的输入数据;在该函数中首先对输入数据的第一个字符str.c_str()[0]进行判断,如果该字符的值不是45,就说明输入的是正数,因为45是字符’-’的值;string::c_str()函数的作用是将string类型转换为C风格字符串。之后通过for循环遍历字符串中的所有字符,如果字符在’0’~’9’范围内,就说明该字符是数字字符。如果输入的数据时数字,则自定义的返回值是true,否则为false。
2.3 类型转换
在判断了输入的数据是数字之后,还需要将string类型转换为unsigned long类型。
unsigned long num_input = 0;
string num_input_string;
do
{
cout << "请输入一个数:";
cin >> num_input_string;
} while (!is_number(num_input_string));
num_input = atol(num_input_string.c_str());
其中,通过do...while语句保证输入的数据是数字,接下来通过atol()函数将string类型转换为unsigned long类型。
3 通过C语言中的getchar()函数输入数据进行判断
getchar()是C语言中的函数,C++中也包含了该函数。getchar()函数的作用是从标准的输入stdin中读取字符。也就是说,getchar()函数以字符为单位对输入的数据进行读取。这样,可以对输入的每个字符进行判断,如果其中的某个字符不是数字,则说明整个输入的数据不是数字。
char buffer[81];
int i, ch;
for (i = 0; (i < 80) && ((ch = getchar()) != EOF) && (ch != '\n'); ++i)
{
if (ch<'0' || ch>'9')
{
cout << "输入的不是数字";
return 0;
}
buffer[i] = (char)ch;
}
其中,getchar()函数在读取的过程中如果发生了错误,或者已经把所有的数据都读完,则该函数返回值为EOF。以上代码将输入的数据保存在了char数组buffer中。
之后,将数组buffer中的字符转换成数字。如buffer数组中的字符是{‘1’, ‘2’, ‘3’,’4’,’5’},则转换后的数字为12345。
int value = 0;
int factor = 1;
for (int j = i - 1; j >= 0; --j)
{
value += (buffer[j]-'0') * factor;
factor *= 10;
}
其中,for循环中的i-1即为输入数据的位数;buffer数组的最后一位对应数字的个位,倒数第二位对应数字的十位,以此类推。变量value为最后转换的值。
C++控制台程序判断输入的数字相关推荐
- C小程序-将输入的数字转换成大写汉字
C小程序-将输入的数字转换成大写汉字C int money,count=0;int i=0;int moneys[6];//定义了输入数字的最高位数char unit[10][2]={"零& ...
- java数字计算结果_Java编写程序之输入一个数字实现该数字阶乘的计算
需求说明: 编写Java程序,输入一个数字,实现该数字阶乘的计算.一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! .例如,5的阶乘等于1*2*3*4*5,表示为5! = 120 ...
- 编写程序判断输入的字母是元音(Vowel)还是辅音(Consonant)。
题目描述 KiKi开始学习英文字母,BoBo老师告诉他,有五个字母A(a), E(e), I(i), O(o),U(u)称为元音,其他所有字母称为辅音,请帮他编写程序判断输入的字母是元音(Vowel) ...
- 完全平方数:若一个整数n能表示成某个整数m的平方的形式,则称这个数为完全平方数。写一个程序判断输入的整数是不是完全平方数。
标题 完全平方数 类别 基本计算 时间限制 1S 内存限制 256Kb 问题描述 若一个整数n能表示成某个整数m的平方的形式,则称这个数为完全平方数.写一个程序判断输入的整数是不是完全平方数. 输入说 ...
- 编写程序判断输入的字符串是否是“回文”
编写程序判断输入的字符串是否是"回文"(顺读和倒读都一样的字符串,称"回文") 下面展示一些 代码及输出结果. 输入:abcba 输出:是回文 // An hi ...
- python if else语句判断输入的数字_Python if else条件控制
Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: if 语句 Python中if语句的一般形式如下所示 ...
- python判断输入的数字是完全平方还是三次方
题目: 写一个从用户读的数字然后满足以下条件: 1.证明它是一个整数 2.告诉用户输入的数字是奇数还是偶数以及正数和负数 3.告诉用户是完全平方 还是三次方 还是都不是 4.程序会一直进行下去如果用户 ...
- Java 判断输入的数字最大值
public class Day04_Max02 {public static void main(String[] args) {java.util.Scanner input = new java ...
- 判断输入的数字是偶数还是奇数 by python
注意:输入的内容默认是str格式,是需要格式转换的,这里是转换成int,一定按自己需求先转换. 方法一:最常用: 基本思想:是否能被2整除,也就是被2除是否有余数 num = int(input(&q ...
最新文章
- 海尔、南方电网:这个AI引擎,装它!
- 利用js-xlsx.js插件实现Excel文件导入并解析Excel数据成json数据格式
- LeetCode 141. 环形链表 简单难度
- MyBaties异常之 ORA-00918: 未明确定义列
- 什么是parquet文件?
- protel PCB布线精华文章
- android的json解析方式,Android解析JSON方式
- 谷歌浏览器(Chrome)遇到Flash崩溃的处理办法
- cms完整视频教程+源码 孔浩老师 全131讲
- WPF中的文字修饰——上划线,中划线,基线与下划线
- [原创]中国大陆民谣盘点8 曹崴《情歌唱晚》
- MIS WiFi安全相关-aircrack-ng破解WiFi密码
- C++的std::is_same与std::decay
- Cris 学 SpringMVC(二):使用 servlet 原生 api 作为方法入参
- CISCO XRV-9K KVM虚机启动问题
- 【sqoop2】创建job报错There are issues with entered data, please revise your input
- ISTQB-FL软件测试基础学习笔记
- 计算组合数c语言ac,AC排列组合
- win7无线局域网_FAST 讯捷路由器的无线应用
- 死磕笔记——安装tf-gpu终结篇
热门文章
- 【考研】数据结构考点——希尔排序
- 【酒店、宾馆】无线局域网方案!~
- 在 Java 中 new 一个对象的流程是怎样的?
- 大数据是把双刃剑,关键看怎么用
- 虚拟机网络(桥接、NAT、仅主机模式)
- 驰为hi10u盘启动linux,官方推荐U盘安装Ubuntu 10.10 方法
- 小程序生成二维码(使用weapp-qrcode)以及相应的bug汇总
- Android Studio 使用intel硬件虚拟化技术,遇到HAXM 安装失败.没有找到硬件的巨坑!
- html5 column-width column-gap,CSS属性参考 | column-width
- 你真的会 UI 设计吗?优漫动游