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
for(k = i; listaNotas[k][0] != menor; k++){}

上記のステートメントは、配列の境界外アクセスを引き起こしています! したがって、segmentation fault. 機能に応じて処理してください。

状態listaNotas[k][0] != menorは致命的です。

于 2013-08-10T08:34:16.897 に答える
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 に答える