如果给出错误输入,则无限循环

时间:2012-10-07 17:41:15

标签: c++ io while-loop infinite-loop

请查看以下代码

#include <iostream>
#include <iomanip>

using namespace std;

double hypontenuse(double,double);


int main()
{
    double side1 = 0;
    double side2 = 0;

    cout << "Enter side1 (-1 to exit)" << endl;
    cin >> side1;

    while(true)
    {

        if(side1==-1)
        {
            break;
        }

        cout << "Enter side2" << endl;
        cin >> side2;

        double result = hypontenuse(side1,side2);

        cout << "The Hypontenuse of the Right Triangle is: " << setprecision(2) << fixed << result << endl;


        cout << "Enter side1 (-1 to exit)" << endl;
        cin >> side1;
    }
} 

double hypontenuse(double side1, double side2)
{
    double result = (side1*side1)+(side2*side2);

    return result;
}

我是C ++的新手。在这段代码中,如果我提供的输入无效(空格,制表符,字母等),则此代码突然变为无限循环。我需要忽略这些无效输入,显示消息,然后返回起始位置。我怎样才能做到这一点?请帮忙!

2 个答案:

答案 0 :(得分:1)

您始终需要检查输入是否成功。通常,只需将流转换为布尔值即可完成此操作:

if (std::cin >> value) {
    process(value);
else {
    // recover from the error
}

从错误的输入中恢复至少包含两部分:

  1. 将流设置回其执行任何操作的状态,例如,使用std::cin.clear()
  2. 摆脱任何违规输入。如何做到这完全取决于您的需求。例如,您可能只能忽略单个字符或直到行尾的所有内容。
  3. 忽略字符的代码看起来就像其中之一:

    std::cin.ignore(); // ignores one character
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore until end of line
    

答案 1 :(得分:0)

就个人而言,我的建议是使用好的旧C“fgets()”和“sscanf()”。

但是,请看这个链接:

它执行以下操作:

1)使用std::getline(std::cin, str)来读取您的原​​始输入(类似于“fgets”)

2)使用std::ws来吃掉空白的空格(如标签,字符和换行符)

不幸的是,它没有帮助验证输入(sscanf()会在一个语句中为你做什么。)

'希望有所帮助

=============================================== ===============

  问:你可以编辑我的代码吗?有点难以理解:( -   Sepala

A:足够公平。这是:

#include <stdio.h>

double 
hypontenuse(double side1, double side2)
{
    return (side1*side1)+(side2*side2);
}


int 
main(int argc, char *argv[])
{
    double side1 = 0;
    double side2 = 0;
    char buff[80];

    while(true)
    {
      printf ("Enter side1 and side2 (-1 to exit): ");
      fgets (buff, sizeof (buff), stdin);
      int iret = sscanf (buff, "%lf %lf", &side1, &side2);
      if (side1 == -1)
        break;
      if (iret != 2)
        continue;

      double result = hypontenuse(side1,side2);
      printf ("The Hypontenuse of the Right Triangle is: %.02lf\n", result);
    }
    printf ("Done.\n");
    return 0;
}