使 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.
}