为某些输入获取分段错误(或错误访问)并且程序停止

时间:2015-03-14 12:18:09

标签: vector segmentation-fault permutation access-violation

#include <iostream>
#include <vector>
#include <string>
using namespace std;
void step_selection_sort(vector <int> &a, int size, int idx){
    int i,j,min,temp;
    i = idx;
    min = i;
    for (j=i+1;j<size;j++)
    {
        if (a[min]>a[j])
            min=j;
    }
    if (min!=i)
    {
        temp = a[i];
        a[i] = a[min];
        a[min] = temp;
    }
    idx++;
}
void selection_sort(vector <int> &a, int size, int idx){
    int i;
    for(i=0;i<size;i++)
    {
        step_selection_sort(a,size,idx);
    }
}
void step_desc_sort(vector <int>& a, int size, int idx){
    int i,j,max,temp;
    i = idx;
    max = i;
    for (j=i+1;j<size;j++)
    {
        if (a[max]<a[j])
            max=j;
    }
    if (max!=i)
    {
        temp = a[i];
        a[i] = a[max];
        a[max] = temp;
    }
    idx++;
}
void desc_sort(vector <int>& a, int size, int idx){
    int i;
    for(i=0;i<size;i++)
    {
        step_desc_sort(a,size,idx);
    }
}
void swap (int & a, int & b)
{
    int t = a;
    a = b;
    b = t;
}
int findCeil (vector <int>& nums, int first, int begin, int end)
{
    int ceilIndex = begin;
    for (int i = begin+1; i <= end; i++)
        if (nums[i] > first && nums[i] < nums[ceilIndex])
            ceilIndex = i;
    return ceilIndex;
}
int findBottom(vector <int>& nums,int first,int begin,int end)
{
    int bottomIndex = begin;
    for (int i = begin+1; i <= end; i++)
        if (nums[i] < first && nums[i] > nums[bottomIndex])
            bottomIndex = i;
    return bottomIndex;
}
void sortedPermutations_ASC (vector <int> nums,int num)
{
    bool isfinished=false;
    if(isfinished==false)
      for(int i=0;i<num;i++)
            cout << nums[i]; //bad access when giving inputs bigger than 8                   
    cout << endl;
    int k;
    for ( k = num - 2; k >= 0; --k )
        if (nums[k] < nums[k+1])
            break;

    if ( k == -1 )
        isfinished=true;
    else
    {
        int ceilIndex = findCeil( nums, nums[k], k + 1, num - 1 );
        swap( nums[k], nums[ceilIndex] );
        selection_sort(nums,num,k+1);
        sortedPermutations_ASC(nums,num);
    }
}
void sortedPermutations_DESC (vector <int> nums,int num)
{
    int i;
    bool isfinished=false;
    if(isfinished==false)
        for(i=0;i<num;i++)
            cout << nums[i];
    cout << endl;

    int k;
    for ( k = num - 2; k >= 0; --k )
        if (nums[k] > nums[k+1])
            break;

    if ( k == -1 )
        isfinished=true;
    else
    {
        int bottomIndex = findBottom( nums, nums[k], k + 1, num - 1 );
        swap( nums[k], nums[bottomIndex] );
        desc_sort(nums,num,k+1);
        sortedPermutations_DESC(nums,num);
    }
    return;
}

int main(){
    vector <int> nums;
    string line,temp;
    int num,j,k;
    getline(cin,line);
    while(j<line.size() && line[j]!=' ')
        j++;
    num=stoi(line.substr(0,j));
    string kind;
    j++;
    kind=line.substr(j);
    if(kind=="ASC"){
        for(k=0;k<num;k++)
            nums.push_back(k+1);
        sortedPermutations_ASC(nums,num);
    }
    if(kind=="DESC"){
        for(k=0;k<num;k++)
            nums.push_back(num-k);
        sortedPermutations_DESC(nums,num);

    }
    return 0;   
}

这是我的代码。它给出了数字的排列。当输入介于1和8之间时,它可以正常工作。但它不适用于大于8的数字。 例如,如果我给

9 ASC(表示按升序排列)

到程序,我得到&#34;分段错误:11&#34;在打印一些排列后在终端(mac)中。

我尝试在Xcode中运行它。用相同的输入说:

线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7ffff5f3fffc8)

表示我在其前面添加评论的行。

我不知道该怎么做......

任何帮助将不胜感激 - 提前感谢

0 个答案:

没有答案