#include <iostream>
using namespace std;
void main() {
// Declaration of Variable
float num1=0.0,num2=0.0;
// Getting information from users for number 1
cout << "Please enter x-axis coordinate location : ";
cin >> num1;
// Getting information from users for number 2
cout << "Please enter y-axis coordinate location : ";
cin >> num2;
cout << "You enter number 1 : " << num1 << " and number 2 : " << num2 <<endl;
我需要这样的东西,当用户输入字母字符时,会显示一个错误,说你应该输入数字。
任何帮助非常感谢
答案 0 :(得分:18)
首先,回答你的问题。这实际上非常简单,您无需在代码中进行太多更改:
cout << "Please enter x-axis coordinate location : " << flush;
if (!(cin >> num1)) {
cout << "You did not enter a correct number!" << endl;
// Leave the program, or do something appropriate:
return 1;
}
此代码基本上检查输入是否被有效地解析为浮点数 - 如果没有发生,则表示错误。
其次,main
的返回类型必须 始终为int
,而不是void
。
答案 1 :(得分:7)
我使用cin.fail()方法或Boost“lexical_cast”正确使用异常来捕获错误http://www.boost.org/doc/libs/1_38_0/libs/conversion/lexical_cast.htm
答案 2 :(得分:6)
使用类似
的内容if (static_cast<int>(num1) == num1) {
// int value
}
else {
// non-integer value
}
答案 3 :(得分:4)
如果要检查整数/浮点数/输入,则不应将cin用于浮点数。而是将其读入字符串,您可以检查输入是否有效。
如果cin读取无效数字,它将进入失败状态,可以使用if(cin.fail())检查
然而,更容易将输入作为字符串读取,然后将输入转换为整数或浮点数。
应该在不是整数的字符上调用isdigit(c)。例如isdigit('1')(注意引号)。
您可以使用strtol尝试将字符串转换为整数。根据结果,您可以尝试转换为浮点。
答案 4 :(得分:3)
虽然其他人已经回答了这个问题,但我想指出isdigit
真正用于什么。它告诉您给定的字符是否代表数字。
基本上,isdigit
的定义可能是:
int isdigit (int c)
{
if (c >= '0' && c <='9')
return 1;
else
return 0;
}
然后,如果您有一个字符串"asdf1234"
,您可以单独检查每个字符以测试它是否为数字/数字:
char *test = "asdf1234";
int i;
for (i = 0; i < strlen (test); i++)
{
if (isdigit (test[i]))
fprintf (stdout, "test[%d] is a digit!\n", i);
}
答案 5 :(得分:2)
将输入输入以适合您使用cin存储的变量。因为您在num1和num2(浮点数)上使用cin,无论用户输入的数字(某种程度),它都是浮点数。
答案 6 :(得分:1)
始终读取字符串中的数字并检查以下内容: -
template <class out_type, class in_type>
out_type convert(in_type const& t)
{
std::stringstream stream;
stream << t; // insert value to stream
// store conversion’s result here
out_type result;
stream >> result; // write value to result
// if there is a failure in conversion the stream will not be empty
// this is checked by testing the eof bit
if (! stream.eof() ) // there can be overflow also
{ // a max value in case of conversion error
result = std::numeric_limits<out_type>::max();
}
return result;
}
用作
int iValue = convert<int>(strVal);
if (std::numeric_limits<int>::max() == iValue)
{
dValue = convert<double>(strVal);
}
这是一种现代的方式: - )
答案 7 :(得分:0)
您可以将输入存储到字符串中,然后创建如下函数:
bool GetInt(const char *string, int *out) { char *end; if (!string) return false; int ret_int = strtoul(string, &end, 10); if (*end) return false; *out = ret_int; return true; }
GetInt(“1234”,&amp; somevariable)返回true并将somevarset设置为1234.GetInt(“abc”,&amp; somevariable)和GetInt(“1234aaaa”,&amp; somevariable)都返回false。这是浮动的版本:
HOT RESULT_MUST_BE_CHKED NONNULL bool GetFloat(const char *string, float *out) { char *end; if (!string) return false; float ret_float = (float)strtod(string, &end); if (*end) return false; *out = ret_float; return true; }
答案 8 :(得分:0)
//Just do a type cast check
if ((int)(num1) == num1){
//Statements
}
答案 9 :(得分:0)
我想验证输入,并且需要确保输入的值是数字,以便它可以存储在数字变量中。最后这项工作对我来说(来源:http://www.cplusplus.com/forum/beginner/2957/
int number;
do{
cout<<"enter a number"<<endl;
cin>>number;
if ((cin.fail())) {
cout<<"error: that's not a number!! try again"<<endl;
cin.clear(); // clear the stream
//clear the buffer to avoid loop (this part was what I was missing)
cin.ignore(std::numeric_limits<int>::max(),'\n');
cout<<"enter a number"<<endl; //ask again
cin>>number;
}
} while (cin.fail());