【问题标题】:Infinite Loop in C++ functionC++ 函数中的无限循环
【发布时间】:2021-03-26 06:35:57
【问题描述】:

我写了一个小程序,把两个整数相加:

#include <iostream>
using namespace std;

int inpInt() {            //ask for an input in integer format
    int number = 0;
    cin >> number;       
    while (!cin) {        //keep asking if the input was not an integer
        cin >> number;
    }
    return number;
}

int main() {
    int summand1, summand2, sum;
    cout << "Summand 1: "; summand1 = inpInt();
    cout << "Summand 2: "; summand2 = inpInt();
    sum = summand1 + summand2;
    cout << "Sum: " << sum << "\n";
}

问题是,当我不输入整数时,我陷入了一个无限循环,我既不能输入整数也不能输入其他任何东西。奇怪的是,当我在 main() 中包含整数测试循环时,代码可以工作。

非常感谢您的帮助!

【问题讨论】:

标签: c++


【解决方案1】:

您必须明确清除 cin 并忽略换行符(按回车时会出现换行符)

int inpInt() {            //ask for an input in integer format
    int number = 0;
    while (!(cin >> number)) {
        cin.clear(); // clear cin
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); // ignore new lines. see: http://www.cplusplus.com/reference/istream/istream/ignore/
    }
    return number;
}

int main() {
    int summand1, summand2, sum;
    cout << "Summand 1: "; summand1 = inpInt();
    cout << "Summand 2: "; summand2 = inpInt();
    sum = summand1 + summand2;
    cout << "Sum: " << sum << "\n";
}

【讨论】:

    【解决方案2】:

    好的。非常感谢您的建议。我的问题是我对 istreams 的了解还不够。清除 cin 是一种解决方案。

    另一个解决方案,正如 Myname 所建议的,是使用 isdigit。程序现在从 cin 中读取一个字符串,用 isdigit 对其进行测试,然后用 atoi 将其转换为 int。万一另一个新手阅读了这个讨论,这是有效的代码:

    #include <iostream>
    using namespace std;
    
    bool checkInt(string str) {
       for (int i = 0; i < str.length(); i++) {
           if (isdigit(str[i]) == false) {
           return false;
        }
       }
       return true;
    }
    
    int getInteger () {
        string inpStr;
        bool checkIntFailed = true;
        while (checkIntFailed) {
            cin >> inpStr;
            if (checkInt(inpStr))
                checkIntFailed = false;
            else cout << "Error: no integer. Try again: ";
    
        }
        return atoi(inpStr.c_str());
    }
    
    int main () {
        int iSummand1, iSummand2, iSum;
        cout << "1st summand: "; iSummand1 = getInteger();
        cout << "2nd summand: "; iSummand2 = getInteger();
        iSum = iSummand1 + iSummand2,
        cout << "Sum: " << iSum << "\n";
    }
    

    周末愉快!

    【讨论】:

      【解决方案3】:

      可以试试这个将数字转换为 char 并检查它的 ascii 代码,因为数字从 48 开始在 ascii 中。

      #include <iostream>
      using namespace std;
      
      int inpInt() {            //ask for an input in integer format
          char number = 48;
          cin >> number;
          
          int c = char(number);
          while (c < 48 || c > 58) {       
              cin >> number;
              c = char(number);
          }
          return number;
      }
      
      int main() {
          int summand1, summand2, sum;
          cout << "Summand 1: "; summand1 = inpInt();
          cout << "Summand 2: "; summand2 = inpInt();
          sum = summand1 + summand2;
          cout << "Sum: " << sum << "\n";
      }
      

      【讨论】:

        【解决方案4】:

        尝试使用函数 isdigit()。

        #include <iostream>
        using namespace std;
        
        int inpInt() {            //ask for an input in integer format
            int number = 0;
            cin >> number;       
            while (isdigit(number))
             {        //keep asking if the input was not an integer
                cin >> number;
            }
            return number;
        }
        
        int main() {
            int summand1, summand2, sum;
            cout << "Summand 1: "; summand1 = inpInt();
            cout << "Summand 2: "; summand2 = inpInt();
            sum = summand1 + summand2;
            cout << "Sum: " << sum << "\n";
        }
        

        【讨论】:

        • 这并不像你想象的那样
        • 可能是,但 isdigit() 函数在这种情况下很有用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        • 2012-02-27
        相关资源
        最近更新 更多