得到结构的学生的名字和标记

时间:2016-03-17 07:34:02

标签: c struct

我有一项任务要求。学生,得到他们的名字和标记,并输出平均超过85的学生。

问题:输入blabla 99 98 95 90后,我没有收到相应的消息。我得到的只是一些平均的随机而已。我的意思是,Print_One()在输入后没有被执行。 (未能将平均值打印在85以上)

这是我的代码:

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

typedef struct {
    char *name;
    int marks[4];
    float avg;
} student;

student *Create_Class(int);
void Avg_Mark(student*);
void Print_One(student*);
void exStudents(student *s, int size);

int main() {
    int size, i;
    student *arr;
    printf("\nEnter the number of students: \n");
    scanf("%d", &size);

    arr = Create_Class(size);
    exStudents(arr, size);

    for (i = 0; i < size; i++)
        free(arr[i].name);

    free(arr);
    getch();
}

student *Create_Class(int size) {
    int i, j;
    int idStud, nameStud, markStud;

    student *classStudent;
    classStudent = (student*)malloc(size * sizeof(student));

    for (i = 0; i < size; i++) {
        classStudent[i].name = (char*)malloc(51 * sizeof(char));
        int numOfmarks = 4;
        int sizeOfName;
        printf("Please enter your name: \n");
        flushall();
        gets(classStudent[i].name);

        sizeOfName = strlen(classStudent[i].name);
        /*
        if (classStudent[i].name > 50) {
            classStudent[i].name = realloc(classStudent[i].name, 51);
            classStudent[i].name[51] = '\0';
        } else {
            classStudent[i].name = realloc(classStudent[i].name, sizeOfName + 1);
        }
        */
        printf("Please enter 4 marks: ");
        for (j = 0; j < numOfmarks; j++) {
            scanf("%d", &classStudent[i].marks[j]);
        }
        Avg_Mark(&classStudent[i]);
    }
    return classStudent;
}

void Avg_Mark(student *s) {
    int i, numOfMarks = 4, sum = 0;

    for (i = 0; i < numOfMarks; i++) {
        sum += s->marks[i];
    }
    s->avg = (sum / 4.0);
}

void Print_One(student *s) {
    printf("The average of %s is %f", s->name, s->avg);
}

void exStudents(student *s, int size) {
    int flag = 1;

    while (size > 0) {
        if (s->avg > 85) {
            Print_One(s);
            flag = 0;
        }
        s++;
        size--;
    }
    if (flag)
        printf("\n There're no students with above 85 average.");
}

2 个答案:

答案 0 :(得分:2)

如果你的输入是这样的:

get

当程序达到scanf时,1之后的第一个换行符仍在输入缓冲区中,因此读取空行,然后scanf("%d ", &size); // note ^ the space will consume the newline 将失败。

一个简单的解决方法是使用以下格式读取第一个数字:

scanf

但是,正如 @chqrlie 指出的那样,&#34;它将继续从stdin读取字节,直到它看到一个不是空白的字节。这将要求用户在写入提示之前回答下一个问题。&#34;

更好的想法是使用另一个// read max 50 char till a newline and extract the rest of line without storing it scanf(" %50[^\n]%*[^\n]", classStudent[i].name); // ^^^ a space at the beginning will also consume trailing spaces or newline 读取名称,但将读取的字符串的最大数量限制为分配的大小,并在格式字符串的开头添加空格以使用所有待处理的空格:

var n = 1.0
var pi = 0.0
while true {
    pi = pi + 4/n
    n = n + 2
    pi = pi - 4/n
    n = n + 2
    print(pi)
}

答案 1 :(得分:1)

它对我有用。我所做的就是使用

_flushall();

而不是

flushall();