您的位置:首页 > 编程语言 > C语言/C++

C++控制台程序判断输入的数字

2017-08-20 10:20 232 查看
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为最后转换的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐