我的代码中的错误在哪里

时间:2013-12-30 15:47:57

标签: c++ sorting data-structures

我是初学者。我试图学习sort()函数的可选第3个参数的用法。我尝试将其应用于按照递增顺序的除数来对1到1000之间的数字进行排序。

这是我的代码

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

struct data {
    int index;
    int divisor;
}a[1001];

bool sortbydivisor (const data &lhs,const data &rhs)
{
    return lhs.divisor <rhs.divisor;
}

int number_of_divisors(int n)
{
    int r=0;
    for (int i=1;i*i<=n;i++)
    {
        if (n%i==0)
        {
            if (i*i!=n)
            {
                r+=2;
            }
        else 
            {
                r+=1;
            }
    }
}

return r;
}

int main ()
{
    int i,t,x;
    for (i=1;i<=1000;i++)
    {
        a[i].index=i;
        a[i].divisor=number_of_divisors(i);
    }

    sort(a+1,a+10001,sortbydivisor);

    scanf("%d",&t);

    for (i=1;i<=t;i++)
    {
        scanf("%d",&x);
        printf("Case %d: %d\n",i,a[x].index);
    }

    return 0;
}

编译后我没有收到任何错误。但在运行之后我得到了这个警告“程序停止工作”。在线编译器中它说“运行时错误”:(。为什么?

先谢谢你的帮助:)。

3 个答案:

答案 0 :(得分:1)

很难知道但是如果你在debug中编译并运行,你应该能够得到一个调用堆栈来确定程序失败的位置,并且应该为你提供程序失败的信息。

请注意,您在初始化循环中使用索引不一致(以1000结尾),在排序算法中使用10001。这超出了你的数组范围。

答案 1 :(得分:0)

你给出了一个无效的上限,所以sort试图在数组结束后移动不存在的对象。你想要

sort(a+1,a+1001,sortbydivisor);  // not 10001

在C ++ 11中,有一些方便的库函数可以避免这样的错误:

sort(std::begin(a) + 1, std::end(a), sortbydivisor);

注意begin由于基于单一的索引而需要略微避开。如果你不能使用C ++ 11库,那么很容易自己编写:

template <typename T, size_t N> T * begin(T (&a)[N]) {return a;}
template <typename T, size_t N> T * end  (T (&a)[N]) {return a+N;}

答案 2 :(得分:0)

sort(a+1,a+10001,sortbydivisor);

愚蠢的拼写错误!