【问题标题】:Making cin take selective inputs [Turbo C++]使 cin 接受选择性输入 [Turbo C++]
【发布时间】:2017-10-10 13:42:54
【问题描述】:

不要讨厌 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;
}

但输出不可取:

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


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

【问题讨论】:

  • 这是 goto 使用不当的例子。不要用 goto 构造循环。使用实际的循环。
  • @hyde 我明白,我在尝试 for 和 do-while 循环后使用了 goto,我尝试了不同的方法来消除多个打印。我发布了 goto 代码,因为这是我最后一次尝试。
  • @AnkurSingh 你每次都去,所以这是一个无限循环......添加if,所以只有当你输入错误时才会执行goto......但for会是更好的代码可能少得多...
  • @Spektre 我明白这一点,但我已经尝试使用 for 和 while。有一段时间了,但在控制台中输入字符串时,我无法摆脱多次打印。我什至试着把 cin>>var;退出循环并在 while 循环中检查它的状态,但由于某些原因,这也给了我多个输出。
  • @AlphaMineron 你也在用 TurboC++ 吗?

标签: cin turbo-c++


【解决方案1】:

这里是 C++ 中的代码 sn-p。

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”这样的情况,在这里你只会得到一个1作为回报。我尝试解决它,但是遇到了一个无限循环,当我修复它时,我会更新代码。
  • 它也不能在 TurboC++ 中有效地运行。我不知道是否有替代方案,但 numeric_limits&lt;streamsize&gt;::max() 参数给出了编译器错误 (numeric_limits & streamsize 的'undefined symbol' error and 'prototype must be defined' error for max()) Turbo C++。

所以,让它在 Turbo C++ 中工作。将 numeric_limits&lt;streamsize&gt;::max() 参数替换为一些较大的 int 值,例如 100。 这将使缓冲区仅被忽略/清除,直到达到 100 个字符或按下“\n”(输入按钮/换行符)。

编辑


以下代码可以在 Turbo C++ 或适当的 C++ 上执行。提供了 cmets 来解释其功能:

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

【讨论】:

    猜你喜欢
    • 2017-01-31
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多