【问题标题】:cin a char into an int variable to stop a loop将 char 转换为 int 变量以停止循环
【发布时间】:2018-06-30 20:22:48
【问题描述】:

我想将数字读入一个固定大小为 10 的静态数组,但用户可以通过输入字符 E 来中断循环。

这是我的代码:

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    int myArray[10];
    int count = 0;
    cout << "Enter upto 10 integers. Enter E to end" << endl;

    for (int i = 0; i < 10; i++)
    {
        cout << "Enter num " << i + 1 << ":";
        cin >> myArray[i];
        if (myArray[i] != 'E')
        {
            cout << myArray[i] << endl;
            count++;
        }
        else
        {
            break;
        }
    }
    cout << count << endl;
    system("PAUSE");
    return 0;
}

但是,我在输入E 时得到以下结果:

Enter upto 10 integers. Enter E to end
Enter num 1:5
5
Enter num 2:45
45
Enter num 3:25
25
Enter num 4:2
2
Enter num 5:E
-858993460
Enter num 6:-858993460
Enter num 7:-858993460
Enter num 8:-858993460
Enter num 9:-858993460
Enter num 10:-858993460
10
Press any key to continue . . .

如何以最简单的方式修复此代码?

【问题讨论】:

  • 因为 cin 无法将 char 读入 int。您可以改为读取一个字符串,并检查第一个字符是否为 'E'

标签: c++ loops char int cin


【解决方案1】:

cin 无法将字符 'E' 解析为 int。解决方案是从用户读取字符串,检查它是否不是“E”(它是一个字符串而不是单个字符,因此您需要使用双引号),然后尝试将字符串转换为int。但是,这种转换可能会引发异常(见下文)。

最简单的解决方案:

#include <iostream>
#include <cmath>
#include <string> //for std::stoi function
using namespace std;

int main()
{
    int myArray[10];
    int count = 0;
    cout << "Enter upto 10 integers. Enter E to end" << endl;

    for (int i = 0; i < 10; i++)
    {
        cout << "Enter num " << i + 1 << ":";
        std::string input;
        cin >> input;
        if (input != "E")
        {
            try
            {
                // convert string to int this can throw  see link below
                myArray[i] = std::stoi(input);
            }
            catch (const std::exception& e)
            {
                std::cout << "This is not int" << std::endl;
            }
            cout << myArray[i] << endl;
            count++;
        }
        else
        {
            break;
        }
    }
    cout << count << endl;
    system("PAUSE");
    return 0;
}

有关std::stoi,请参阅documentation。它可以抛出异常,所以你的程序会突然结束(通过终止),这就是为什么在它周围有 trycatch 块。当用户在您的字符串中放入一些垃圾值时,您需要处理这种情况。

【讨论】:

    【解决方案2】:

    如果你调试这个,你会发现你所有的myArray[i]都是-858993460 (=0x CCCC CCCC),这是堆栈中未初始化变量的值。

    当您将E 放入int 变量myArray[i] 时。 std::cin 将状态标志 badbit 设置为 1

    然后当你运行cin &gt;&gt; myArray[i] 时,它会跳过它。换句话说,什么都不做。

    最后,你会得到如上的结果。

    【讨论】:

      【解决方案3】:

      只需使用:

      char myArray[10];
      

      因为在获取字符时获取输入控制台时然后尝试将char 转换为int 这是不可能的并将默认值存储在std::cin 即'E' 到0(默认值 int )。

      使用下面的代码:

      #include <iostream>
      #include <cmath>
      using namespace std;
      
      int main()
      {
          char myArray[10];
          int count = 0;
          cout << "Enter upto 10 integers. Enter E to end" << endl;
          for (int i = 0; i < 10; i++)
          {
              cout << "Enter num " << i + 1 << ":";
              cin >> myArray[i];
              if (myArray[i] == 'E')
              {
                  break;
              }
              else
              {
                  cout << myArray[i] << endl;
                  count++;
              }
          }
      exitloop:
          cout << count << endl;
          system("PAUSE");
          return 0;
      }
      

      输出:

      Enter upto 10 integers. Enter E to end
      Enter num 1:1
      1
      Enter num 2:E
      1
      sh: 1: PAUSE: not found
      

      【讨论】:

      • 如果您输入 2 位或 3 位数字,这将不起作用。 char 变量只能包含一个符号。
      【解决方案4】:

      问题是尝试将E 读取为int 失败,并将流置于停止读取的错误状态(您不会注意到,因为在那之后它不会做任何事情)并使您的数组元素未初始化。

      最简单的方法是在读取整数失败时中断:

      for(int i = 0; i < 10; i++)
      {
          cout << "Enter num " << i + 1 << ":";
          if (cin >> myArray[i])
          {
              cout << myArray[i] << endl;
              count++;
          }
          else
          {
              break;
          }
      }
      

      如果您想专门检查E,您需要先读取一个字符串,然后将其转换为int(如果不是E)。
      作为奖励,您需要处理既不是 int 也不是 E 的所有内容,这会使代码有点复杂。
      像这样的:

      int count = 0;
      string input;
      while (cin >> input && count < 10)
      {
          if (input == "E")
          {
              break;
          }
          istringstream is(input);
          if (is >> myArray[count])
          {
              cout << myArray[count] << endl;
              count++;
          }
          else
          {
              cout << "Please input an integer, or E to exit." << endl;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-23
        • 2012-08-07
        • 1970-01-01
        相关资源
        最近更新 更多