将char转换为int变量以停止循环

时间:2018-01-22 08:44:10

标签: c++ loops char int cin

我想将数字读入固定大小为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 . . .

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

4 个答案:

答案 0 :(得分:0)

cin无法将字符'E'解析为int。解决方案是从用户检查中读取字符串,如果它不是&#34; E&#34; (它是一个字符串而不是单个字符,因此您需要使用双引号)然后尝试将字符串转换为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查看try。它可以抛出异常,因此您的程序将突然(通过终止)结束,这就是围绕它的catch{ "request": [ { "md5": "8dfa1440953c3d93daafeae4a5daa326", "features": [ "te", "av", "extraction" ], "file_name": "example.xls" "te": { "reports": [ "xml", "pdf" ] } "extraction": { "method": "pdf" } } ] } 块的原因。当用户在字符串中放入一些垃圾值时,您需要处理这种情况。

答案 1 :(得分:0)

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

E添加到int变量myArray[i]时。 std::cin会将州旗badbit设置为1

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

最后,您将得到上述结果。

答案 2 :(得分:0)

只需使用:

char myArray[10];

因为在获取输入控制台时获取字符然后尝试将char转换为int这是不可能的,并将默认值存储在std::cin中,即&#39; E&# 39;到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

答案 3 :(得分:0)

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

最简单的方法是打破任何读取整数的失败:

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
作为奖励,您需要处理intE的所有内容,这会使代码复杂化。
像这样:

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