我有一项任务要求。学生,得到他们的名字和标记,并输出平均超过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.");
}
答案 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();