有关应用指针的问题,它使循环无限

时间:2019-01-18 12:55:33

标签: c++ loops for-loop pointers c++17

我是程序员和计算器的新手,他使用该程序来计算另一组数字,并在对输入控件进行循环之后,我决定进行内存管理,因为先前的输入只是与新输入保持堆栈输入号码。

我确实尝试应用一些指针和内存管理,但这只是使第一个for循环无限循环。但是,如果我删除了指针,它将使程序正常运行,但是先前计算出的值将被添加到新计算出的值中。

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

int main(){

    //variables
    float a[1000],c;
    char d,e;
    int f = 1,g;

    //pointers
    float *b;

    do{
        system("CLS");

        cout << endl;
        cout << "  Welcome!!!" << endl;
        cout << endl;
        cout << "  This is a calculator (obviously)" << endl;
        cout << endl;
        cout << "  Please input how many entities to be calculated: ";
        cin >> g;
        cout << endl;
        cout << endl;

        for(int h = 0;h < g; h++){
            cout << "  Input numbers: ";
            cin >> a[1000];
        }

        cout << endl;
        cout << "  Choose the LETTER corresponding to the operation below" << endl << endl;
        cout << "   A - Addition" << endl;
        cout << "   S - subtraction" << endl;
        cout << "   M - Multiplication" << endl;
        cout << "   D - Divison" << endl << endl;

        cout << "  Choose operation to be used: ";
        cin >> d;
        d = toupper(d);

        if((d != 'A') && (d != 'S') && (d != 'M') && (d != 'D')){
            do {
            cout << "  Choose operation from [A - S - M - D] respectively: ";
            cin >> d;
            d = toupper(d);
            }while((d != 'A') && (d != 'S') && (d != 'M') && (d != 'D'));
        }

        switch (d){
            case 'A':
                for(int h = 0;h < g; h++){
                    c +=a[1000];
                }
                cout << "  sum is " << c << endl;
                break;
            case 'S':
                for(int h = 0;h < g; h++){
                    c -=a[1000];
                }
                cout << "  difference is " << c << endl;
                break;
            case 'M':
                for(int h = 0;h < g; h++){
                    c *=a[1000];
                }
                cout << "  product is " << c << endl;
                break;
            case 'D':
                for(int h = 0;h < g; h++){
                    c /=a[1000];
                }
                cout << "  quotient is " << c << endl;
                break;
        }

        do{
            cout << endl;
            cout << "  Would you like to calculate again? [Y/N] ";
            cin >> e;
            e = toupper(e);
        }while ((e !='N') && (e != 'Y'));

        if (e == 'Y'){
            // Announce pointer and deletion of values ; also to clear memory on new start.
            //
        }
        else{
            f = 0;
        }
    }while (f == 1);

return 0;
}

1 个答案:

答案 0 :(得分:2)

我真的不明白您指的是什么指针或内存管理。但是,

cin >> a[1000];

是错误的。包含1000个元素的数组的最后一个有效索引为999。您正在访问超出范围的数组,这会调用未定义的行为。可能发生任何事情(不是真的,但最好是这样考虑)。

正确的循环应该是(“最小更改以避免ub”中的“正确”):

for(int h = 0;h < g; h++){
    cout << "  Input number: ";
    cin >> a[h];
}

但是,如果用户为1000输入的数字大于g,这也会引起麻烦。您真正应该使用的是std::vector,它使您可以按需要输入任意数量的元素,而不必在编译时指定其大小。

PS:如果您的代码没有指针或没有手动内存管理就可以了,那么没有理由添加它。指针和(手动)内存管理很复杂,要学会处理它主要是学习如何避免它。