1

在我的代码中:

int nAlunos, nNotas;

/*size input*/

scanf("%d", &nAlunos);

scanf("%d", &nNotas);

/*arrays*/

int ordenador [nAlunos];
char listaNomes [nAlunos][16];
float listaNotas [nAlunos][nNotas+1];

/*non-arrays*/

int i, k;

/*input*/

for(i = 0; i < nAlunos; i++){
    scanf("%s", listaNomes[i]);
    for(k = 1; k <= nNotas; k++){
        scanf("%f", &listaNotas[i][k]);
    }
}


/*sum of grades / number os grades for each person*/

for(i = 0; i < nAlunos; i++){
    listaNotas[i][0] = 0;

    for(k = 1; k <= nNotas; k++)
        listaNotas[i][0] += listaNotas[i][k];

    listaNotas[i][0] /= nNotas;
}


/*process order on vector*/

for(i = 0; i < nAlunos; i++){
    menor = 1111;

    for(k = i; k < nAlunos; k++)
        if (listaNotas[k][0] < menor)
            menor = listaNotas[k][0];

    for(k = i; listaNotas[k][0] != menor; k++){}

    ordenador[k] = i;
    ordenador[i] = k;
}
for(i = 0; i < nAlunos; i++)
    printf("%d", ordenador[i]);

}

我正在尝试从用户那里填充数据表,我可能不会对此类使用指针。

它需要接收如下所示的数据:

String1
float1 float2...
String2
.
.
.

运行它时,它运行良好,直到我完成最后一个输入。之后它只是中断执行并返回我分段错误:11

我试图找到它可能在哪里访问不正确的内存,但这对我来说没有意义,因为我找不到它。

4

2 回答 2

0

这是您的代码的简单改编,对scanf()调用进行错误检查:

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

static void err_exit(const char *msg);

int main(void)
{
    int nAlunos, nNotas;

    if (scanf("%d", &nAlunos) != 1 || scanf("%d", &nNotas) != 1)
        err_exit("failed to read dimensions");

    char listaNomes[nAlunos][16];
    float listaNotas[nAlunos][nNotas+1];
    int i, k;

    for (i = 0; i < nAlunos; i++)
    {
        if (scanf("%s", listaNomes[i]) != 1)
            err_exit("failed to read name");

        for (k = 1; k <= nNotas; k++)
        {
            if (scanf("%f", &listaNotas[i][k]) != 1)
                err_exit("failed to read grade");
        }
    }

    for (i = 0; i < nAlunos; i++)
    {
        printf("%s:", listaNomes[i]);
        for (k = 1; k <= nNotas; k++)
            printf(" %f", listaNotas[i][k]);
        putchar('\n');
    }
    return 0;
}

static void err_exit(const char *msg)
{
    fprintf(stderr, "%s\n", msg);
    exit(1);
}

给定输入文件:

3
4
name-the-first
12 13 14 15
name-the-second
21 22 23 24
name-the-third
31 310 3109 31098

该程序的输出是:

name-the-first: 12.000000 13.000000 14.000000 15.000000
name-the-second: 21.000000 22.000000 23.000000 24.000000
name-the-third: 31.000000 310.000000 3109.000000 31098.000000

这是应该预料到的。

代码中唯一奇怪的是使用,for (k = 1; k <= nNotas; k++)因为它listaNotas[i][0]未初始化和未使用。但是,您确实分配了足够的空间,因此这不会造成麻烦。

概括

问题在您显示的代码中并不明显。请显示崩溃的实际代码!

于 2013-08-10T08:07:57.220 回答
0
for(k = i; listaNotas[k][0] != menor; k++){}

上面的语句导致了数组的越界访问!因此segmentation fault. 根据您的功能处理它。

这种情况listaNotas[k][0] != menor是致命的。

于 2013-08-10T08:34:16.897 回答