【问题标题】:How to fix this bug in my MINGW for my C++ code?如何为我的 C++ 代码修复我的 MINGW 中的这个错误?
【发布时间】:2022-01-11 17:26:26
【问题描述】:

我正在从 Codeforces 解决这个问题。 Link

我使用 Sublime Text 3 作为我的代码编辑器和 Mingw 作为我的编译器。当我使用我的 Mingw 编译和运行代码时,它给出了错误的答案,而当我使用 https://ideone.com/ 时,我的答案不同并且是正确的。

我的代码

using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);

    int arr[4];
    int ans = 0;
    for (int i = 0; i < 4; ++i)
    {
        cin >> arr[i];
    }

    for (int i = 0; i < 4; ++i)
    {
        if (arr[i] == arr[i + 1] || arr[i] == arr[i + 2] || arr[i] == arr[i + 3]) {
            ans++;
        }

    }

    cout << ans;


}
Test-Case:1 
INPUT:
4 4 4 4

MINGW OUTPUT:
4
IDEONE OUTPUT:
3
Test-Case:2
INPUT:
1 7 3 3

MINGW OUTPUT:
2
IDEONE OUTPUT:
1

【问题讨论】:

  • 您在for 循环中有越界访问。将此:int a[4]; 更改为:std::array&lt;int, 4&gt; a;,然后将此:if (arr[i] == arr[i + 1] || arr[i] == arr[i + 2] || arr[i] == arr[i + 3]) 更改为:if (arr.at(i) == arr.at(i + 1) || arr.at(i) == arr.at(i + 2) || arr.at(i) == arr.at(i + 3))。然后,无论您使用什么编译器,您都会看到问题。
  • 当i == 3 时,你认为arr[i + 1] 应该是什么?
  • @PaulMcKenzie 当我用你的代码替换我的代码时,我收到了这个错误。 terminate called after throwing an instance of 'std::out_of_range' what(): array::at: __n (which is 4) &gt;= _Nm (which is 4)
  • @SoumyajoyDas - 这个错误是意料之中的,我们已经指出了问题所在。 at() 函数会自动检查数组边界,而使用哑数组的原始代码不会。
  • @SoumyajoyDas 但我没有得到任何输出 -- 你的代码停止了,因为你越界了,这就是 at() 调用所做的。不需要其他更改——您需要修复代码中的逻辑,以免越界。它与是否使用矢量绝对无关。再看一下前两个 cmets——你的代码逻辑完全错误。

标签: c++ arrays algorithm for-loop undefined-behavior


【解决方案1】:

在这个for循环中

for (int i = 0; i < 4; ++i)
{
    if (arr[i] == arr[i + 1] || arr[i] == arr[i + 2] || arr[i] == arr[i + 3]) 
    {
        ans++;
    }

}

在数组边界之外有许多访问。所以程序有未定义的行为。

要解决这个问题,你应该选择一个合适的容器来存储输入的值。

如果使用标准容器std::set,任务可以更简单地解决。

这是一个演示程序。

#include <iostream>
#include <set>

int main() 
{
    const size_t N = 4;
    
    std::set<unsigned int> set;
    
    for ( size_t i = 0; i < N; i++ )
    {
        unsigned int value;
        std::cin >> value;
        
        set.insert( value );
    }
    
    std::cout << N - set.size() << '\n';
    
    return 0;
}

例如如果要输入以下值序列

1 7 3 3

那么程序输出将是

1

对于这个值序列

4 4 4 4

输出将是

3

如果使用数组,那么程序可以如下所示。

#include <iostream>

int main() 
{
    const size_t N = 4;
    unsigned int a[N];
    
    for ( size_t i = 0; i < N; i++ )
    {
        std::cin >> a[i];
    }
    
    size_t ans = 0;
    
    for ( size_t i = 1; i < N; i++)
    {
        size_t j = 0;
        
        while ( j != i && a[j] != a[i] ) ++j;
        
        if ( j != i ) ++ans;
    }
    
    std::cout << ans << '\n';
    
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2019-12-04
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多