使cin采取选择性输入[Turbo C ++]

时间:2017-10-10 13:42:55

标签: cin turbo-c++

不讨厌Turbo,我已经讨厌我的学校了!

如果在某个文件(例如年龄或百分比)中输入字符而不是int或float,我希望显示错误消息。 我写了这个函数:

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;
}

但输出不可取: OUTPUT SCREEN

如何停止多次重复错误消息? 有更好的方法吗?

注意:请确保这是我们正在谈论的TurboC ++,我尝试使用此 question 中的方法,但即使在包含限制之后.h,它没有用。

1 个答案:

答案 0 :(得分:1)

这是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;
}

这些变量经过量身定制,可与您的变量相匹配。所以你可以更好地理解。这段代码并不完美。

  • 它无法处理像&#34; 1fff&#34;这样的情况,在这里你只会获得1回报。我尝试解决它但是遇到了无限循环,当我修复它时,我会更新代码。
  • 它也不能有效地在TurboC ++中起作用。我不知道是否有其他选择,但numeric_limits<streamsize>::max()参数会给出编译器错误(&#39;未定义的符号&#39;错误,对于numeric_limits&amp; streamsize和&#39;原型必须是在Turbo C ++中定义了max())的错误。

因此,要使其在Turbo C ++中运行。将numeric_limits<streamsize>::max()参数替换为一些大的int值,例如100。 这将使缓冲区仅被忽略/清除,直到达到100个字符或者&#39; \ n&#39; (按下/输入按钮/换行符)。

修改

以下代码可以在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.
}