【问题标题】:C - Sorting in dynamic array doesn't work for specific number of valuesC - 动态数组中的排序不适用于特定数量的值
【发布时间】:2015-01-29 15:55:13
【问题描述】:

我的任务是为从文件中读取的整数值创建一个排序算法。这些值必须在数组中排序,因为值的数量是可变的,我使用了一个动态整数数组(实际上是我第一次)。

现在,该算法似乎工作正常,因为它以正确的顺序打印所有值,但直到有 6 个值要排序。在那种情况下,没有任何输出,似乎连排序过程都不再成功。

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

void swap(int *a, int *b){
..
}

int main(){
    int i,anzahl,sorted=0,bla;
    FILE *fp;
    int* feld;

    fp=fopen("file","r");
    if (fp==NULL) return 0;
    else {
        fscanf(fp,"%i",&anzahl);
        feld=(int*)calloc(anzahl,sizeof(int));
        for (i = 0; i <= anzahl; ++i) {
            fscanf(fp,"%i",&bla);
            *(feld+i)=bla;
        }
        fclose(fp);
        while (sorted==0){
            for (i = 0; i < anzahl-1; ++i) {
                if (feld[i]>feld[i+1]) swap(&feld[i],&feld[i+1]);
            }
            for (i = 0; i < anzahl-1; ++i) {
                if (feld[i]<=feld[i+1]) sorted=1;
                else {sorted=0; break;}
            }
        }
        for (i = 0; i <anzahl; ++i) {
            printf("%i ",feld[i]);
        }
    }
    return 0;
}

请原谅德语变量名和新手风格的代码。

如果现在我的“文件”的内容如下:

6
1
5
1
99
7
8

该程序将无法运行。如果我改变值的数量,一切都很好,但只要值的数量是 6,无论有什么值,程序都不会工作。

【问题讨论】:

  • void swap(int *a, int *b) { .. }是什么功能太复杂不能贴出来?
  • 您可以对变量名进行一些搜索+替换。并且可能在您的源中永久重命名bla
  • 不,事实上我认为仅仅通过它的名字就很容易理解它的功能。它只是交换 a 和 b。

标签: c arrays sorting dynamic


【解决方案1】:

您将在此处越界导致未定义的行为:

for (i = 0; i <= anzahl; ++i)
               ^

这一行应该比较 less than 而不是 equal or less than

同时检查 calloc() 返回值总是一个好主意。

【讨论】:

  • @asdfqwer 真的没有什么特别的原因。这是未定义的行为。
  • &lt;替换&lt;=
  • 嗯,好的,现在我明白了。这很尴尬。非常感谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多