使 cin 接受选择性输入 [Turbo C++]
Making cin take selective inputs [Turbo C++]
不要讨厌Turbo的原因,我已经讨厌我的学校了!
如果在某些文件(例如年龄或百分比)中输入的是字符而不是整数或浮点数,我希望显示错误消息。
我写了这个函数:
template <class Type>
Type modcin(Type var) {
take_input: //Label
int count = 0;
cin>>var;
if(!cin){
cin.clear();
cin.ignore();
for ( ; count < 1; count++) { //Printed only once
cout<<"\n Invalid input! Try again: ";
}
goto take_input;
}
return var;
}
但输出并不理想:
如何阻止错误消息重复多次?
有没有更好的方法?
注意:请确保这是我们正在谈论的 TurboC++,我尝试使用此 question[=27 中的方法=],但即使包含 limits.h,它也不起作用。
这里是 C++ 代码片段。
template <class Type>
Type modcin(Type var) {
int i=0;
do{
cin>>var;
int count = 0;
if(!cin) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
for ( ; count < 1; count++) { //Printed only once
cout<<"\n Invalid input! Try again: ";
cin>>var;
}
}
} while (!cin);
return var;
}
这些变量是根据您的变量量身定制的,因此您可以更好地理解。不过这段代码并不完美。
- 它不能处理像“1fff”这样的情况,在这里你只会在return中得到一个1。我尝试解决它但是遇到了无限循环,当我修复它时,我会更新代码。
- 在TurboC++中也无法有效运行。我不知道是否有其他选择,但
numeric_limits<streamsize>::max()
参数给出编译器错误 ('undefined symbol' error for numeric_limits & streamsize 和 'prototype must be defined' error for max ()) 在 Turbo C++ 中。
所以,让它在 Turbo C++ 中工作。将 numeric_limits<streamsize>::max()
参数替换为一些大的 int 值,例如 100。
这将使缓冲区只有 ignored/cleared 直到达到 100 个字符或按下 '\n'(输入 button/newline 字符)。
编辑
以下代码可以在 Turbo C++ 或适当的 C++ 上执行。提供评论以解释功能:
template <class Type> //Data Integrity Maintenance Function
Type modcin(Type var) { //for data types: int, float, double
cin >> var;
if (cin) { //Extracted an int, but it is unknown if more input exists
//---- The following code covers cases: 12sfds** -----//
char c;
if (cin.get(c)) { // Or: cin >> c, depending on how you want to handle whitespace.
cin.putback(c); //More input exists.
if (c != '\n') { // Doesn't work if you use cin >> c above.
cout << "\nType Error!\t Try Again: ";
cin.clear(); //Clears the error state of cin stream
cin.ignore(100, '\n'); //NOTE: Buffer Flushed <|>
var = modcin(var); //Recursive Repeatation
}
}
}
else { //In case, some unexpected operation occurs [Covers cases: abc**]
cout << "\nType Error!\t Try Again: ";
cin.clear(); //Clears the error state of cin stream
cin.ignore(100, '\n'); //NOTE: Buffer Flushed <|>
var = modcin(var);
}
return var;
//NOTE: The '**' represent any values from ASCII. Decimal, characters, numbers, etc.
}
不要讨厌Turbo的原因,我已经讨厌我的学校了!
如果在某些文件(例如年龄或百分比)中输入的是字符而不是整数或浮点数,我希望显示错误消息。 我写了这个函数:
template <class Type>
Type modcin(Type var) {
take_input: //Label
int count = 0;
cin>>var;
if(!cin){
cin.clear();
cin.ignore();
for ( ; count < 1; count++) { //Printed only once
cout<<"\n Invalid input! Try again: ";
}
goto take_input;
}
return var;
}
但输出并不理想:
如何阻止错误消息重复多次? 有没有更好的方法?
注意:请确保这是我们正在谈论的 TurboC++,我尝试使用此 question[=27 中的方法=],但即使包含 limits.h,它也不起作用。
这里是 C++ 代码片段。
template <class Type>
Type modcin(Type var) {
int i=0;
do{
cin>>var;
int count = 0;
if(!cin) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
for ( ; count < 1; count++) { //Printed only once
cout<<"\n Invalid input! Try again: ";
cin>>var;
}
}
} while (!cin);
return var;
}
这些变量是根据您的变量量身定制的,因此您可以更好地理解。不过这段代码并不完美。
- 它不能处理像“1fff”这样的情况,在这里你只会在return中得到一个1。我尝试解决它但是遇到了无限循环,当我修复它时,我会更新代码。
- 在TurboC++中也无法有效运行。我不知道是否有其他选择,但
numeric_limits<streamsize>::max()
参数给出编译器错误 ('undefined symbol' error for numeric_limits & streamsize 和 'prototype must be defined' error for max ()) 在 Turbo C++ 中。
所以,让它在 Turbo C++ 中工作。将 numeric_limits<streamsize>::max()
参数替换为一些大的 int 值,例如 100。
这将使缓冲区只有 ignored/cleared 直到达到 100 个字符或按下 '\n'(输入 button/newline 字符)。
编辑
以下代码可以在 Turbo C++ 或适当的 C++ 上执行。提供评论以解释功能:
template <class Type> //Data Integrity Maintenance Function
Type modcin(Type var) { //for data types: int, float, double
cin >> var;
if (cin) { //Extracted an int, but it is unknown if more input exists
//---- The following code covers cases: 12sfds** -----//
char c;
if (cin.get(c)) { // Or: cin >> c, depending on how you want to handle whitespace.
cin.putback(c); //More input exists.
if (c != '\n') { // Doesn't work if you use cin >> c above.
cout << "\nType Error!\t Try Again: ";
cin.clear(); //Clears the error state of cin stream
cin.ignore(100, '\n'); //NOTE: Buffer Flushed <|>
var = modcin(var); //Recursive Repeatation
}
}
}
else { //In case, some unexpected operation occurs [Covers cases: abc**]
cout << "\nType Error!\t Try Again: ";
cin.clear(); //Clears the error state of cin stream
cin.ignore(100, '\n'); //NOTE: Buffer Flushed <|>
var = modcin(var);
}
return var;
//NOTE: The '**' represent any values from ASCII. Decimal, characters, numbers, etc.
}