在我的代码中:
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
我试图找到哪里可以访问不正确的内存,但它对我来说没有意义,因为我找不到它。
答案 0 :(得分: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]
保持未初始化和未使用状态。但是,您确实分配了足够的空间,以免造成麻烦。
在您展示的代码中,问题并非显而易见。请显示崩溃的实际代码!
答案 1 :(得分:0)
如果要使用任意长度的数组,则必须使用动态内存分配。如果您不知道如何操作,可以使用大型数组,它不优雅或高效,但如果您的作业不是动态内存分配,它可以工作。
如果使用大型阵列解决方案,则必须使用足够大的阵列来管理更糟糕的情况(即:拥挤的教室或许多等级)。 类似的东西:
#define MAX_N_ALUMNOS 100 //Or more
#define MAX_N_NOTAS 100 //Or more
...
char listaNomes [MAX_N_ALUMNOS][16];
float listaNotas [MAX_N_ALUMNOS][MAX_N_NOTAS+1];
如果使用动态内存分配解决方案,则必须使用malloc和free并处理异常。 这样的事情可能有用:
#include <stdlib.h>
...
char listaNomes [];
float listaNotas [];
listaNomes = (char*) malloc (nAlunos*16);
if (listaNomes==NULL) exit (1);
listaNotas = (char*) malloc (nAlunos*(nNotas+1));
if (listaNotas==NULL) exit (1);
...
for(i = 0; i < nAlunos; i++){
scanf("%s", listaNomes[i*16]);
for(k = 1; k <= nNotas; k++){
scanf("%f", listaNotas[(i*nNotas)+k]);
}
}
...
free (listaNomes);
free (listaNotas);
...
答案 2 :(得分:0)
for(k = i; listaNotas[k][0] != menor; k++){}
以上语句导致数组的超出访问权限!因此segmentation fault
。根据您的功能处理它。
条件listaNotas[k][0] != menor
是致命的。