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++控制台程序判断输入的数字相关推荐

  1. C小程序-将输入的数字转换成大写汉字

    C小程序-将输入的数字转换成大写汉字C int money,count=0;int i=0;int moneys[6];//定义了输入数字的最高位数char unit[10][2]={"零& ...

  2. java数字计算结果_Java编写程序之输入一个数字实现该数字阶乘的计算

    需求说明: 编写Java程序,输入一个数字,实现该数字阶乘的计算.一个数字的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n! .例如,5的阶乘等于1*2*3*4*5,表示为5! = 120 ...

  3. 编写程序判断输入的字母是元音(Vowel)还是辅音(Consonant)。

    题目描述 KiKi开始学习英文字母,BoBo老师告诉他,有五个字母A(a), E(e), I(i), O(o),U(u)称为元音,其他所有字母称为辅音,请帮他编写程序判断输入的字母是元音(Vowel) ...

  4. 完全平方数:若一个整数n能表示成某个整数m的平方的形式,则称这个数为完全平方数。写一个程序判断输入的整数是不是完全平方数。

    标题 完全平方数 类别 基本计算 时间限制 1S 内存限制 256Kb 问题描述 若一个整数n能表示成某个整数m的平方的形式,则称这个数为完全平方数.写一个程序判断输入的整数是不是完全平方数. 输入说 ...

  5. 编写程序判断输入的字符串是否是“回文”

    编写程序判断输入的字符串是否是"回文"(顺读和倒读都一样的字符串,称"回文") 下面展示一些 代码及输出结果. 输入:abcba 输出:是回文 // An hi ...

  6. python if else语句判断输入的数字_Python if else条件控制

    Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: if 语句 Python中if语句的一般形式如下所示 ...

  7. python判断输入的数字是完全平方还是三次方

    题目: 写一个从用户读的数字然后满足以下条件: 1.证明它是一个整数 2.告诉用户输入的数字是奇数还是偶数以及正数和负数 3.告诉用户是完全平方 还是三次方 还是都不是 4.程序会一直进行下去如果用户 ...

  8. Java 判断输入的数字最大值

    public class Day04_Max02 {public static void main(String[] args) {java.util.Scanner input = new java ...

  9. 判断输入的数字是偶数还是奇数 by python

    注意:输入的内容默认是str格式,是需要格式转换的,这里是转换成int,一定按自己需求先转换. 方法一:最常用: 基本思想:是否能被2整除,也就是被2除是否有余数 num = int(input(&q ...

最新文章

  1. 海尔、南方电网:这个AI引擎,装它!
  2. 利用js-xlsx.js插件实现Excel文件导入并解析Excel数据成json数据格式
  3. LeetCode 141. 环形链表 简单难度
  4. MyBaties异常之 ORA-00918: 未明确定义列
  5. 什么是parquet文件?
  6. protel PCB布线精华文章
  7. android的json解析方式,Android解析JSON方式
  8. 谷歌浏览器(Chrome)遇到Flash崩溃的处理办法
  9. cms完整视频教程+源码 孔浩老师 全131讲
  10. WPF中的文字修饰——上划线,中划线,基线与下划线
  11. [原创]中国大陆民谣盘点8 曹崴《情歌唱晚》
  12. MIS WiFi安全相关-aircrack-ng破解WiFi密码
  13. C++的std::is_same与std::decay
  14. Cris 学 SpringMVC(二):使用 servlet 原生 api 作为方法入参
  15. CISCO XRV-9K KVM虚机启动问题
  16. 【sqoop2】创建job报错There are issues with entered data, please revise your input
  17. ISTQB-FL软件测试基础学习笔记
  18. 计算组合数c语言ac,AC排列组合
  19. win7无线局域网_FAST 讯捷路由器的无线应用
  20. 死磕笔记——安装tf-gpu终结篇

热门文章

  1. 【考研】数据结构考点——希尔排序
  2. 【酒店、宾馆】无线局域网方案!~
  3. 在 Java 中 new 一个对象的流程是怎样的?
  4. 大数据是把双刃剑,关键看怎么用
  5. 虚拟机网络(桥接、NAT、仅主机模式)
  6. 驰为hi10u盘启动linux,官方推荐U盘安装Ubuntu 10.10 方法
  7. 小程序生成二维码(使用weapp-qrcode)以及相应的bug汇总
  8. Android Studio 使用intel硬件虚拟化技术,遇到HAXM 安装失败.没有找到硬件的巨坑!
  9. html5 column-width column-gap,CSS属性参考 | column-width
  10. 你真的会 UI 设计吗?优漫动游