对字符串

时间:2015-10-27 16:40:43

标签: c++ string sorting

我试图使用插入排序根据中间三个字符对字符串数组进行排序。

代码编译但在运行时崩溃

我正在排序中间3个字符的数组,并且还对存储字符串索引的数组进行排序。 这样在打印最终结果时我可以得到一个排序数组

void ins(string a[size],int n)
{
    int i,j,k,length[size],index[size],m,t;
    string temp,ts[size];      // ts[] stores the middle 3 characters
    for(i=0;i<n;i++)
    {
        index[i]=i;
    }
    for(i=0;i<n;i++)
    {
        length[i]=a[i].length();
    }
    for(i=0;i<n;i++)
    {
        m=length[i]/2;
        ts[i]=a[i].substr(m-1,3);
    }
    for(i=0;i<n;i++)
        cout<<ts[i]<<endl;
    for(k=1;k<n;k++)
    {
        temp=ts[k];
        t=index[k];
        j=k-1;
        while((temp < ts[j]) && (j>=0))
        {
            ts[j+1]=ts[j];
            index[j+1]=index[j];
            j=j-1;
        }

        ts[j+1]=temp;
        index[j+1]=t;
    }
    for(i=0;i<n;i++)
    {
        cout<<a[index[i]]<<endl;
    }
}

int main()
{
    int n,i,j,k,num;
    string a[size];
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    ins(a,n);
}
你可以帮我找一下这个bug

1 个答案:

答案 0 :(得分:2)

表格left-condition && right-condition

  1. 首先评估左侧条件;
  2. 接下来会发生什么取决于左边条件的评估结果:
    1. 如果 left-condition 为true,则 right-condition 将在第二个时间内进行评估。
    2. 如果 left-condition 为false,则跳过对右条件的评估。
  3. 在您的情况下,问题在于表达式(temp < ts[j]) && (j>=0),因为它实现了以下行为:

    1. 您首先在左侧表达式中使用ts[j];
    2. 然后,您使用j>=0的右表达式进行测试,以便ts[j]不会超出范围。
    3. 解决方案只是交换这些表达式的位置并将表达式写为:(j >= 0 && temp < ts[j])