📅  最后修改于: 2023-12-03 15:08:35.034000             🧑  作者: Mango
在 C++ 中,我们经常需要从用户输入中获取数据。但是有时,我们只想接受特定类型的数据而不是字符串,这时候需要拒绝字符串输入。下面我们探讨几种做法。
istream 是一个用于输入的类,它提供了重载运算符的方法用来定义输入数据的方式。我们可以对输入字符串输入进行重载,限制用户只能输入数值类型的数据。下面是实现的代码:
#include <iostream>
using namespace std;
istream& operator >> (istream& input, int& num) {
string str;
input >> str;
try {
num = std::stoi(str);
}
catch (const std::invalid_argument& e) {
input.setstate(std::ios::failbit);
}
return input;
}
int main() {
int num;
cout << "Enter a number: ";
cin >> num;
if (cin.fail()) {
cout << "Invalid input." << endl;
}
else {
cout << "Number entered: " << num << endl;
}
return 0;
}
在这个例子中,istream& operator >> (istream& input, int& num)
重载了输入运算符。首先获取用户输入的字符串,然后使用 std::stoi()
方法将其转换为整数类型的数据。 如果转换过程中发生了错误,我们使用 std::ios::failbit
标记设置输入流状态并返回。如果转换成功,我们将数据赋值给 num
,并正常返回输入流对象。
在 main()
函数中,我们使用这个重载的运算符读取用户输入,如果输入流处于无效状态,则打印 "Invalid input.",否则打印 "Number entered: " 和输入的数值。
getline()
方法读取字符串,然后进行转换此方法与第一种方法相似,不过我们使用 getline()
方法来直接读取用户输入的字符串,而不是使用运算符进行转换。下面是实现的代码:
#include <iostream>
#include <string>
using namespace std;
bool isNumber(const string& str) {
for (unsigned int i = 0; i < str.size(); i++) {
if (!isdigit(str[i])) {
return false;
}
}
return true;
}
int main() {
int num;
string str;
cout << "Enter a number: ";
getline(cin, str);
if (!isNumber(str)) {
cout << "Invalid input." << endl;
}
else {
num = std::stoi(str);
cout << "Number entered: " << num << endl;
}
return 0;
}
在这个例子中,我们定义了一个 isNumber()
函数用于检测用户输入是否是数值类型的数据。该函数对输入的每个字符进行检查,如果遇到不是数字的字符,则返回 false
。如果所有字符都是数字,则返回 true
。
在 main()
函数中,我们使用 getline()
方法读取字符串,然后使用 isNumber()
方法检测字符串是否合法。 如果合法,则使用 std::stoi()
方法将其转换为整数类型的数据。 如果不合法,则打印 "Invalid input."。
在 C++ 中,有多种方法可以拒绝用户输入字符串。以上这两种方法应该够用了。希望可以帮到你!