好吧,我正在尝试使用指针,所以我正在尝试为用户输入编写输入验证,以确保正确处理任何非数字的内容。当我使用isdigit()不适合我。当我输入字母表时,我仍然会遇到异常。有什么建议?谢谢。看看这个:
#include<iostream>
#include<algorithm>
#include<string>
#include<cctype>
using namespace std;
void EnterNumbers(int * , int);
int main()
{
int input = 0;
int *myArray;
cout << "Please enter the number of test scores\n\n";
cin >> input;
//Allocate Array
myArray = new int[input];
EnterNumbers(myArray,input);
delete[] myArray;
return 0;
}
void EnterNumbers(int *arr, int input)
{
for(int count = 0; count < input; count++)
{
cout << "\n\n Enter Grade Number " << count + 1 << "\t";
cin >> arr[count];
if(!isdigit(arr[count]))
{
cout << "Not a number";
}
}
}
答案 0 :(得分:4)
如果您测试if (!(cin >> arr[count])) ...
而不是isdigit(arr[digit])
测试arr[digit]
的值是否为数字的ASCII码[或者可能与日语,中文或阿拉伯语匹配(即,作为阿拉伯语脚本字体,而不是像我们的“阿拉伯语”数字一样的0-9。因此,如果您输入48到57,它会说没关系,但是如果您键入6或345,它会抱怨它不是数字......
一旦发现了非数字,您还需要从“垃圾”中退出或清除输入缓冲区。 cin.ignore(1000, '\n');
将读取下一个换行符或1000个字符,以先发生者为准。如果某人输入了一百万位,可能会很烦人,但除此之外,应该可以解决问题。
当然,您还需要一个循环来再次读取该数字,直到输入有效数字。
答案 1 :(得分:1)
我进行这种输入验证的方式是我使用std::getline(std::cin, str)
获取整行输入,然后使用以下代码解析它:
std::istringstream iss(str);
std::string word;
// Read a single "word" out of the input line.
if (! (iss >> word))
return false;
// Following extraction of a character should fail
// because there should only be a single "word".
char ch;
if (iss >> ch)
return false;
// Try to interpret the "word" as a number.
// Seek back to the start of stream.
iss.clear ();
iss.seekg (0);
assert (iss);
// Extract value.
long lval;
iss >> lval;
// The extraction should be successful and
// following extraction of a characters should fail.
result = !! iss && ! (iss >> ch);
// When the extraction was a success then result is true.
return result;
答案 2 :(得分:0)
isdigit()
适用于char
而不是int
。 cin >> arr[count];
语句已确保输入中给出整数数字格式。分别检查cin.good()
(!cin
)是否存在可能的输入解析错误。