C 无法找出什么是错误的连续循环

C 无法找出什么是错误的连续循环,c,infinite-loop,C,Infinite Loop,我有一个我正在写的成绩册程序,在我的get_data函数的末尾有一个无限循环,我不明白为什么它没有退出循环。以下是我应该运行的示例: ID, NAME, GRADE 2442 Kapowski, Kelly 87 99 100 87 88 -99 1254 Slater, A.C. 90 100 -99 8742 Morris, Zack 77 65 50 80 66 -99 守则: #include <stdio.h> #include <stdlib.h> #inc

我有一个我正在写的成绩册程序,在我的get_data函数的末尾有一个无限循环,我不明白为什么它没有退出循环。以下是我应该运行的示例:

ID, NAME, GRADE
2442
Kapowski, Kelly
87 99 100 87 88 -99
1254
Slater, A.C.
90 100 -99
8742
Morris, Zack
77 65 50 80 66 -99
守则:

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

#define MAX_NAME 50
#define MAX_SCORES 20
#define MAX_FILE_NAME 100

typedef struct {
    char name[MAX_NAME];
    int id;
    double scores[MAX_SCORES];
    int num_scores;

} student_t;

double student_average (student_t student);
FILE * get_data_file();
void get_data(student_t students[], int num_students, FILE *input_file);
void sort_student_array(student_t students[], int num_students);
int find_index_of_next(const student_t students[], int num_elements, int start_index);
void display_data(const student_t students[], int num_elements);

int main()
{
    student_t *students;
    FILE *input_file;
    int num_students;


    input_file = get_data_file();

    fscanf (input_file, "%d", &num_students);

    students = (student_t *)calloc(num_students, sizeof(student_t));

    get_data(students, num_students, input_file);

    sort_student_array(students, num_students);

    display_data(students, num_students);

    free(students);

    return 0;
}

double student_average (student_t student)
{
    double average,
           total;
    int count;

    for (count = 0; count < student.num_scores; count++)
        total += student.scores[count];

    average = total / student.num_scores;

    return average;
}

FILE * get_data_file()
{
    int valid = 0;
    char file_name[MAX_FILE_NAME];
    FILE *in_file;

    printf("Welcome to the automated grade book program. Version 2.0\n");

    do
    {

        printf ("Enter student data filename:");
        scanf ("%s", file_name);
        in_file = fopen (file_name, "r");

        if (in_file != NULL)
        {
            valid = 1;
        }
        else
        {
            printf ("Unable to open file %s. Try again.\n", file_name);
        }
    } while (!valid);
    return in_file;
}

void get_data(student_t students[],
              int num_students,
              FILE *input_file)
{
    int count;
    int count2;
    student_t student;
    double value;

    for (count = 0; count < num_students; count++)
    {

        fscanf (input_file, "%d\n", &student.id);

        fgets (student.name, MAX_NAME, input_file);

        student.name[strlen(student.name)-1] = '\0';

        fscanf(input_file, "%lf", &value);

/*
/I am getting stuck right HERE
*/
        count2 = 0;
        while (value != -99)
        {
            student.scores[count2] = value;
            fscanf(input_file, "%lf", &value);
            count2++;             
        }

        student.num_scores = count2;

        students[count] = student;

    }
}
#包括
#包括
#包括
#定义最大名称50
#定义最高20分
#定义最大文件名100
类型定义结构{
字符名[MAX_name];
int-id;
双倍分数[最高分数];
int num_分数;
}学生;;
双倍学生平均分(学生);
文件*获取数据文件();
void get_数据(student_t students[],int num_students,FILE*input_FILE);
无效排序学生数组(学生[],整数学生);
int find_index_of_next(const student_t students[],int num_元素,int start_index);
无效显示数据(常量学生[],整数元素);
int main()
{
学生*学生;
文件*输入文件;
国际大学学生;
输入文件=获取数据文件();
fscanf(输入文件,“%d”&num个学生);
学生=(学生*)calloc(学生人数,学生人数);
获取学生数据(学生、学生人数、输入文件);
排序学生数组(学生、学生数量);
显示学生数据(学生、学生人数);
免费(学生);
返回0;
}
双倍学生平均数(学生)
{
双倍平均,
全部的
整数计数;
对于(count=0;count
我打赌文件中的一个
-
符号实际上是另一个字符。这会导致
fscanf
失败,
value
从未设置,并且您有一个无限循环。您应该检查转换函数的返回值-例如

if(fscanf(input_file, "%lf", &value) !=1) break;

这将不是第一个有棘手转折的作业…

我强烈感觉值从未设置为-99。检查=>
while(value!=-99)
始终检查任何scanf系列函数的返回值,以防出现解析错误(因此,您读取的值未被修改)。调试器将是您真正的朋友。你已经知道在哪里设置断点了,我更强烈的感觉是直接的浮点等式比较通常是个坏主意。您可能希望调试打印您正在检索的值,以验证您得到的是您认为的值。+1对于名称,您可以对输入文件进行十六进制转储,以查看我是否正确。。。或者做
grep“-99”| wc-l
,看看你是否得到了预期的匹配数……同意我删除的答案中的两个观点+我刚刚意识到我只是在扩展@hyde的评论,所以这里有一个给你们的提示!例如,请参阅“导致fscanf失败的棘手角色”,我现在开始怀疑我的解决方案,因为文件的状态始终是格式良好的。也就是说,每个学生总是有三行数据,第三行总是以-99结尾。