C++控制台程序判断输入的数字
2017-08-20 10:20
232 查看
C++标准库中的iostream库的基础是用于表示输入流的istream类型和用于表示输出流的ostream类型。处理输出时使用ostream类型的对象cout,处理输入时使用istream类型的对象cin。
使用cin和输入操作符>>可以将输入的数据保存到变量中。有时要求输入的数据必须是数字,此时就需要在处理输入数据之前对其进行判断。
以上代码执行的结果如图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为最后转换的值。
使用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为最后转换的值。
相关文章推荐
- VC6 C++控制台程序如何判断用户输入的是什么数字[必须小于128]?
- (c++)设圆半径r,圆柱高h 求圆周长C1、圆面积Sa、圆球表面积Sb、圆球体积Va、圆柱体积Vb。 用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 PI=3
- P51 第4题 编写一个程序,判断用户输入的字符是否是数字,若是数字,则输出“a numerical character”,否则输出“other character”.
- java控制台程序如何判断String字符串中只输入了一个回车
- java控制台程序如何判断String字符串中只输入了一个回车
- 编写一个Java应用程序。用户从键盘输入一个1—9999之间的数,程序将判断这个数是几位数,并判断这个数是否是回文数。回文数是指将该数含有的数字逆序排列后得到的数和原数相同,例如12121、3223都
- 编写一个Java应用程序。用户从键盘输入一个1—9999之间的数,程序将判断这个数是几位数, 并判断这个数是否是回文数。回文数是指将该数含有的数字逆序排列后得到的数和原数相同, 例如12121、3
- 笔试题——编写java程序:输入一个字符串,判断有几个英文字母,有几个数字,有几个其它的字符
- C++控制台程序字符输入总结
- java算法程序题,输入三个数求哪个是最大数,先判断这三个数是否整数,不是就打印提示:请输入数字,若是就打印出那个最大数
- 判断两个字符串内数字是否相同,向量相同的C++程序。
- 一个程序看C++中输入作为判断语句的逻辑
- 2. 编写一个Java应用程序,用户从键盘输入一个1~9999之间的数,程序将判断这个数是几位数,并判断这个数是否是回文数。回文数是指将该数含有的数字逆序排列后得到的数和原数相同,例如12121、32
- 编写程序,判断用户输入的数字是否完全数.所谓“完全数”是指整数n的所有因子(不包括n)之和等于n自身。例如28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28是“完全数”。
- c++实现判断在命令行中输入几个数字然后对输入的数字进行冒泡法排序
- 判断任意控制台输入十进制数是否为水仙花数(C++)
- c++ 判断输入的一个double数的每一位是不是阿拉伯数字
- @V@ java代码笔记2010-06-12:java控制台输入各类型类实现;以及判断输入字符串里面是否有数字的两种方法:方法1:转换成字符数组;方法2:正则表达式。
- c_c++控制台程序字符输入总结
- 习题:编写一个程序,请输入两个数字,并判断两个数字的大小。