C语言 尝试从用户输入的数组中获取最小数字时出现分段错误



我正在制作一个程序来计算用户输入测试的平均值,在用户输入测试数量后,用户必须输入输入测试数量的每个等级,之后程序将读取输入的等级数组,然后得到最低成绩,之后程序将计算平均值, 然后输出该,然后输出最低等级,然后调用函数"letter();"以根据平均值获得字母等级。但是当它从数组中获取最低数字时,它会给我一个我无法修复的分段错误

我试图重做那部分代码,但无济于事

#include <stdio.h>
void letter();
int average;
int main()
{
int a[100], i, sum = 0, num, lowest, test;
printf("Enter the numbers of tests: ");
scanf("%d", &test);
while (test > 100 || test <= 0)
{
printf("Error! The number of tests should be in range of (1 to 100).n");
printf("Enter the number again: ");
scanf("%d", &test);
}
for(i = 0; i < test; ++i)
{
printf("%d. Enter grade for this test: ", i+1);
scanf("%d", &a[i]);
sum += a[i];
}
lowest = a[0];
for (i = 0; i < num; i++)
{
if (a[i] < lowest)
{
lowest = a[i];
}
}
average = sum / test;
printf("Average = %d", average);
return (0);
}
void letter()
{
if (average == 0 || average <= 60)
{
printf("Your average is a F. n");
}
else if (average <= 70 || average >= 61)
{
printf("Your average is a D. n");
}
else if (average <= 80 || average >= 71)
{
printf("Your average is a C. n");
}
else if (average <= 90 || average >= 81)
{
printf("Your average is a B. n");
}
else if (average <= 100 || average >= 91)
{
printf("Your average is a A. n");
}
}

编辑

我添加了

printf("Your average is: %d n", average);
printf("The lowest grade is: %d n", lowest);
letter();

average = sum / test;

并将字母功能更改为此,但没有给我正确的字母等级

void letter()
{
if (average >= 0 || average <= 59)
{
printf("Your average is a F. n");
}
else if (average >= 60 || average <= 69)
{
printf("Your average is a D. n");
}
else if (average >= 70 || average <= 79)
{
printf("Your average is a C. n");
}
else if (average >= 80 || average <= 89)
{
printf("Your average is a B. n");
}
else if (average >= 90 || average <= 99)
{
printf("Your average is a A. n");
}
}

编辑#2将字母功能更改为此,现在可以工作了,感谢大家的帮助,并花时间帮助我。

void letter()
{
if (average == 0 && average <= 60)
{
printf("Your average is a F. n");
}
else if (average <= 70 && average >= 61)
{
printf("Your average is a D. n");
}
else if (average <= 80 && average >= 71)
{
printf("Your average is a C. n");
}
else if (average <= 90 && average >= 81)
{
printf("Your average is a B. n");
}
else if (average <= 100 && average >= 91)
{
printf("Your average is a A. n");
}
}

我看到的问题是

for (i = 0; i < num; i++)

在这里,num是未初始化使用的。如果您尝试使用变量的值

  • 从不初始化
  • 可以有陷阱表示
  • 地址从未被占用

它调用未定义的行为。

解决方案:您希望使用test作为循环计数器。

而且,在您的代码中,您从未调用过letter()

打印预期输出的代码的修改版本。

变量num在堆栈上分配,并且未初始化,因此它将具有垃圾值。 您在下面的循环中使用它for。因此,如果num任意大于或等于 100,您将尝试访问a[num]数组超出界外访问并可能导致崩溃。您应该在下面的 for 循环中使用test而不是num

for (i = 0; i < num; i++)
{
if (a[i] < lowest)
{
lowest = a[i];
}
}

变量num未初始化,在for循环中使用

for (i = 0; i < num; i++)

这会导致未定义的行为。分段错误可能是由于以下检查中用作数组索引的未初始化值numa导致越界内存访问。

if (a[i] < lowest)

在你进入循环的时候

for (i = 0; i < num; i++) {
if (a[i] < lowest)

您的变量num未初始化。这是未定义的行为,由于当时的值大于99i,可能会导致段错误。

改为写for (i = 0; i < test; i++)

相关内容

  • 没有找到相关文章

最新更新