c - 为什么连续的 fget 接受输入但在循环打印时将其存储为不同的或空白数据?
问题描述
我是编码初学者,使用 fgets 时遇到问题,因为它接受我放置的输入,但是当我尝试使用 printf 输出它时,它不是正确的输入。
如果答案很明显,我很抱歉,但我已经在这个问题上停留了一个小时。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
int eh;
char name[32];
char idnum[32];
char coursename[9][20];
int numberofcourses;
int unit[9];
float grade[9];
}information;
int main(){
char id[32];
char course_name[12];
information info[21];
char buf[3];
int numberofstud;
printf("Enter Number of Students:");
fgets(buf, sizeof buf, stdin);
sscanf(buf, "%d", &numberofstud);
fflush(stdin);
for(int i=0; i<numberofstud;i++){
printf("Enter UP Student Number:");
fgets(info[i].idnum, sizeof info[i].idnum, stdin);
printf("Enter Name:");
fgets(info[i].name, sizeof info[i].name, stdin);
printf("Enter Number of Enrolled Courses:");
fgets(buf, sizeof buf, stdin);
sscanf(buf, "%d", &info[i].numberofcourses);
getchar();
for(int j=0; j<info[i].numberofcourses;j++){
printf("Enter Course Name:");
fgets(buf, sizeof info[i].coursename[j], stdin);
sscanf(buf, "%s", &info[i].coursename[j]);
printf("Enter Course Units:");
fgets(buf, sizeof info[i].unit[j], stdin);
sscanf(buf, "%d", &info[i].unit[j]);
printf("Enter Course Grade:");
fgets(buf, 5, stdin);
sscanf(buf, "%f", &info[i].grade[j]);
getchar();
}
}
for(int i=0; i<numberofstud;i++){
printf("%s", info[i].idnum);
printf("%s", info[i].name);
for(int j=0; j<info[i].numberofcourses;j++){
printf("%s, %d, %.3f", info[i].coursename[j], info[i].unit[j], info[i].grade[j]);
}
}
return 0;
}
这是我尝试运行程序时发生的情况的示例
样本输出:
Enter Number of Students:1
Enter UP Student Number:412412
Enter Name:Martinez
Enter Number of Enrolled Courses:1
Enter Course Name:CMSC 11
Enter Course Units:2
Enter Course Grade:3
412412
CMSC, 2, 3.000
我也不介意您指出我的代码中的任何错误或不良做法,以便我不断改进!感谢您的时间。
解决方案
在您的最终打印中添加换行符为我解决了这个问题。@Jonathan Leffer的评论也是正确的,您可能会砍掉您的输入或超出缓冲区,使其保持如此之小,如果内存空间不是限制,最好提供比可能需要的更多空间。
话虽如此,我对其进行了一些清理并添加了这些换行符,以下代码似乎按预期运行。我还注释掉了一些getchar
电话和一个fflush
,如果删除这些电话是错误的,我将它们留在了取消注释中。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
int eh;
char name[32];
char idnum[32];
char coursename[9][20];
int numberofcourses;
int unit[9];
float grade[9];
}information;
int main(){
char id[32];
char course_name[12];
information info[21];
char buf[32]; //Increased your buffer size
int numberofstud;
printf("Enter Number of Students:");
fgets(buf,sizeof(buf),stdin);
sscanf(buf, "%d", &numberofstud);
//fflush(stdin);
for(int i=0; i<numberofstud;i++){
printf("Enter UP Student Number:");
fgets(info[i].idnum,sizeof(info[i].idnum),stdin);
printf("Enter Name:");
fgets(info[i].name,sizeof(info[i].name),stdin);
printf("Enter Number of Enrolled Courses:");
fgets(buf,sizeof(buf),stdin);
sscanf(buf, "%d", &info[i].numberofcourses);
//getchar();
for(int j=0; j<info[i].numberofcourses;j++){
printf("Enter Course Name:");
fgets(buf,sizeof(buf),stdin);
sscanf(buf, "%s", &info[i].coursename[j]);
printf("Enter Course Units:");
fgets(buf,sizeof(buf),stdin);
sscanf(buf, "%d", &info[i].unit[j]);
printf("Enter Course Grade:");
fgets(buf,sizeof(buf),stdin);
sscanf(buf, "%f", &info[i].grade[j]);
//getchar();
}
}
for(int i=0; i<numberofstud;i++){
printf("%s\n", info[i].idnum);
printf("%s\n", info[i].name);
for(int j=0; j<info[i].numberofcourses;j++){
printf("%s, %d, %.3f", info[i].coursename[j], info[i].unit[j], info[i].grade[j]);
}
}
return 0;
}
推荐阅读
- apache-spark - Spark -- 从 Spark 2.3 的 SQL Server 返回标识值
- python - 从多个日期获取平均日期 - 熊猫
- php - PhpSpreadsheet foreach 循环通过多个工作表
- javascript - 我可以在内容加载时显示组件吗?- 角2+
- docker - 从开发机器上 Service Fabric 上的 Docker 容器访问反向代理
- amazon-web-services - 找不到命令:Amazon Linux 2018.03 上的 systemctl
- python - 在python中创建并行for循环
- c# - Wpf StreamGeometry 意外值
- python - 规范化熊猫数据框的行
- javascript - 如何在 JavaScript 中计算整数中的 1 位