在指向整数数组的指针中使用scanf
该程序应该存储3个学生的输入成绩并打印平均值。 但是,如果我要求学生B的平均分,它会打印出学生A的平均分数,而学生A的平均分数为0.我似乎无法找到我出错的地方..请帮助例如Student_A = {7,7, 7},Student_B = {8,8,8}; ave(学生_B)= 7
#include int i; char j; int student_A[4]; int student_B[4]; int student_C[4]; float grade_input(int student[]); float ave(int student[]); main(){ printf("For Student A:\n"); grade_input(&student_A[4]); printf("For Student B:\n"); grade_input(&student_B[4]); printf("For Student C:\n"); grade_input(&student_C[4]); do{ printf("Whose average grade do you want to see, a ,b ,c? "); getchar(); scanf("%c", &j); if(j=='a'){ printf("%.2f\n", ave(student_A)); } if(j=='b'){ printf("%.2f\n", ave(student_B)); } if(j=='c'){ printf("%.2f\n", ave(student_C)); } }while(j=='a' || j=='b' || j=='c'); } float grade_input(int student[]){ int i; for(i=0; i<3; i++){ printf("Enter grade %d: ", i+1); scanf("%d", &student[i]); } } float ave(int student[]){ return (student[0] + student[1] + student[2])/3.0; }
你遇到的问题是将&student_X[4]
传递给grade_input()
。 这只是非法的,因为它是一个4元素arrays; 没有定义访问带有下标4的元素。 由于它们是连续定义的,当你用&student_A[4]
调用grade_input()
函数时,你最终会有效地将指针发送到student_B
,而这正是你所看到的!
您应该将指针传递给数组。 我稍微改写了下面的代码来说明。
#include int i; char j; int student_A[4]; /* ******* */ /* note that student_A is defined as a 4 element array */ int student_B[4]; int student_C[4]; float grade_input(int student[]); float ave(int student[]); main(){ printf("For Student A:\n"); /* ******* */ /* note that student_A is defined as a 4 element array */ /* a pointer to the array is just student_A, not &student_A[4] */ grade_input(student_A); printf("For Student B:\n"); grade_input(student_B); printf("For Student C:\n"); grade_input(student_C); do{ printf("Whose average grade do you want to see, a ,b ,c? "); scanf("%c", &j); if(j=='a'){ printf("%.2f\n", ave(student_A)); } else if(j=='b'){ printf("%.2f\n", ave(student_B)); } else if(j=='c'){ printf("%.2f\n", ave(student_C)); } else printf ( "Enter a, b or c\n" ); }while(j != 'q'); } float grade_input(int student[]){ int i; for(i=0; i<3; i++){ printf("Enter grade %d: ", i+1); scanf("%d", &student[i]); } } float ave(int student[]){ return (student[0] + student[1] + student[2])/3.0; }
没有必要做getchar();
在scanf("%c", &j);
之前scanf("%c", &j);
你应该用fflush(stdout);
清理缓冲区的人fflush(stdout);
或者做
char c; while ((c = getchar()) != '\n');
所以你的完整代码应该像:
#include int i; char j; int student_A[4]; int student_B[4]; int student_C[4]; float grade_input(int student[]); float ave(int student[]); main(){ printf("For Student A:\n"); grade_input(&student_A[4]); printf("For Student B:\n"); grade_input(&student_B[4]); printf("For Student C:\n"); grade_input(&student_C[4]); do{ printf("Whose average grade do you want to see, a ,b ,c? "); fflush(stdout); // THE CHANGE scanf("%c", &j); if(j=='a'){ printf("%.2f\n", ave(student_A)); } if(j=='b'){ printf("%.2f\n", ave(student_B)); } if(j=='c'){ printf("%.2f\n", ave(student_C)); } }while(j=='a' || j=='b' || j=='c'); } float grade_input(int student[]){ int i; for(i=0; i<3; i++){ printf("Enter grade %d: ", i+1); scanf("%d", &student[i]); } } float ave(int student[]){ return (student[0] + student[1] + student[2])/3.0; }