您能否解释一下运行时错误是如何解决的

时间:2020-02-15 13:06:57

标签: c++ visual-studio

void adde(int& v, char array[5])
{

    if (v > 5) {
        v = -1;
    }

    for (int k = 0; k < 5; k++) {
        if (array[k] == 'C') {
            array[k] = '-';
        }
    }
    v++;
    array[v] = 'C';
}

这是我的功能

int mov = -1;
char item[5];
for (int i = 0; i < 5; i++) {
    item[i] = '-';
}
cout << "Initially " << endl;
for (int i = 0; i < 5; i++) {
    cout << "[" << i + 1 << " ] ";
}
cout << endl;
for (int j = 0; j < 5; j++) {
    cout << item[j] << "    ";
}
cout << endl;
cout << "After Item 1, " << endl;
adde(mov, item);
for (int j = 0; j < 5; j++) {
    cout << item[j] << "    ";
}
cout << endl;
cout << "After Item 2, " << endl;
adde(mov, item);
for (int j = 0; j < 5; j++) {
    cout << item[j] << "    ";
}
cout << endl;
cout << "After Item 3, " << endl;
adde(mov, item);
for (int j = 0; j < 5; j++) {
    cout << item[j] << "    ";
}
cout << endl;
cout << "After Item 4, " << endl;
adde(mov, item);
for (int j = 0; j < 5; j++) {
    cout << item[j] << "    ";
}
cout << endl;
cout << "After Item 5, " << endl;
adde(mov, item);
for (int j = 0; j < 5; j++) {
    cout << item[j] << "    ";
}
cout << endl;

直到这里我的代码都可以正常工作。 在最后一个项目之后,我希望光标指向第一个索引 但显示奇怪的库运行时错误 运行之后,这段突出显示的代码部分 cout <<“在第6项之后”,<< << endl;

adde(mov,item);

for(int j = 0; j <5; j ++){cout << item [j] <<“”; }

1 个答案:

答案 0 :(得分:0)

标题##您犯了一个简单的错误。这里不需要调试器。 C / C ++中的数组以索引0开头。因此,如果您有一个大小为5的数组,例如在示例char item[5];中,则有效索引为0、1、2、3、4。但不是5。

在函数adde中,您仅具有错误的边界检查。在您的第一个语句中,您已经写过:

if (v > 5) {

然后再

    v++;
    array[v] = 'C';

因此,如果v为> 3,例如4或5,则将其递增并访问array[5]array[6],这超出范围并产生错误。 / p>

您可以直接更正并使用

if (v > 3) {

您的第一个陈述。这样可以解决问题:

#include <iostream>

void adde(int& v, char array[5])
{

    if (v > 3) {
        v = -1;
    }

    for (int k = 0; k < 5; k++) {
        if (array[k] == 'C') {
            array[k] = '-';
        }
    }
    v++;
    array[v] = 'C';
}

int main() {
    int mov = -1;
    char item[5];
    for (int i = 0; i < 5; i++) {
        item[i] = '-';
    }
    std::cout << "Initially " << std::endl;
    for (int i = 0; i < 5; i++) {
        std::cout << "[" << i + 1 << " ] ";
    }
    std::cout << std::endl;
    for (int j = 0; j < 5; j++) {
        std::cout << item[j] << "    ";
    }
    std::cout << std::endl;
    std::cout << "After Item 1, " << std::endl;
    adde(mov, item);
    for (int j = 0; j < 5; j++) {
        std::cout << item[j] << "    ";
    }
    std::cout << std::endl;
    std::cout << "After Item 2, " << std::endl;
    adde(mov, item);
    for (int j = 0; j < 5; j++) {
        std::cout << item[j] << "    ";
    }
    std::cout << std::endl;
    std::cout << "After Item 3, " << std::endl;
    adde(mov, item);
    for (int j = 0; j < 5; j++) {
        std::cout << item[j] << "    ";
    }
    std::cout << std::endl;
    std::cout << "After Item 4, " << std::endl;
    adde(mov, item);
    for (int j = 0; j < 5; j++) {
        std::cout << item[j] << "    ";
    }
    std::cout << std::endl;
    std::cout << "After Item 5, " << std::endl;
    adde(mov, item);
    for (int j = 0; j < 5; j++) {
        std::cout << item[j] << "    ";
    }

    std::cout << std::endl;
    std::cout << "After Item 6, " << std::endl; 
    adde(mov, item);
    for (int j = 0; j < 5; j++) {
        std::cout << item[j] << "    ";
    }
    std::cout << std::endl;
    return 0;
}

请另外注意:

设计不是很好。请不要在C ++中使用C样式的数组。请避免在函数调用中指针衰减。请重新考虑您的完整设计。我可以看到,你在做什么。使用C ++可以更轻松地完成此操作,但是对于一个真正好的或适当的解决方案,我们需要了解这些要求。