为什么for循环退出c ++?

时间:2018-12-30 02:00:56

标签: c++ for-loop

这是代码:

pair<string,int> bank[20];
int n, money, people, temp, money_given;
string current_giver, current_receiver;
int main() {
    freopen ("readme.txt","r",stdin);
    cin >> n;
    for (int i =0; i != n; ++i){
        cin >> bank[i].first;

    }
    for (int m = 0; m != n; ++m){

        cin >> current_giver;
        cout << current_giver <<endl;
        cin >> money >> people;
        money_given = money - (money%people);
        //to subtract money
        for (auto j : bank){
            if (j.first == current_giver)
                bank[temp].second -= money_given;
            else
                ++temp;
        }

        temp = 0;
        //to add money
        for (int i =0; i < people ;++i){
            cin >>current_receiver;

            for (int j =0; j <sizeof(bank); ++j){
                if (bank[j].first == current_receiver)
                    bank[j].second += money_given/people;
            }
        }
    }
    **for (auto j : bank){
        cout << j.first << ' ' <<j.second <<endl;
    }**

粗体部分将不会执行,但是上述for循环的每个部分似乎都可以正常工作。我认为第二个for循环并没有退出,但是我不确定为什么。如果是由其他原因引起的问题,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:2)

sizeof(bank)不提供数组中元素的数量,而是完整对象的大小(以字节为单位)。这将大于元素的数量,因为每个元素都是一对,包含至少一个字节大小的多个子对象。因此,您的循环越界并导致未定义的行为。

自C ++ 17起,您可以使用({#include<iterator>预先)获取数组中的元素数:

std::size(bank)

,或者您可以使用std::array而不是普通数组(事先为#include<array>)。它具有成员函数.size(),该函数将返回元素数。