尝试从用户输入的数组中获取最低编号时出现分段错误

时间:2019-04-15 05:53:22

标签: c arrays segmentation-fault

我正在制作一个程序,用于计算用户输入的测试的平均值,在用户输入了测试数量之后,用户必须输入所输入测试数量的每个等级,之后程序将读取进入输入的等级数组,然后获得最低等级,此后程序将计算平均值,然后输出平均值,然后输出最低等级,然后调用函数“ 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");
    }
}

4 个答案:

答案 0 :(得分:3)

我看到的问题是

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

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

  • 从未初始化
  • 可以有陷阱表示
  • 从来没有住过地址

它调用undefined behavior.

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

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

A modified version of your code which prints the expected output.

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

这导致undefined behavior。分段错误可能是由于以下事实引起的:num的未初始化值用作数组a的索引,导致在以下检查中超出范围的内存访问。

 if (a[i] < lowest)

答案 3 :(得分:2)

您进入循环

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

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

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