为什么连续的 fgets 接受输入但在循环打印时将其存储为不同或空白数据?
Why does consecutive fgets accept input but stores it as a different or blank data when printed in a loop?
我是编码初学者,使用 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 的评论是正确的,你可能会砍掉你的输入或溢出一个缓冲区,让它保持这么小,如果内存 space 不是限制,最好提供比可能需要更多的空间.
话虽如此,我稍微清理了一下并添加了那些换行符,以下代码似乎按预期运行。我还注释掉了一些 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;
}
我是编码初学者,使用 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 的评论是正确的,你可能会砍掉你的输入或溢出一个缓冲区,让它保持这么小,如果内存 space 不是限制,最好提供比可能需要更多的空间.
话虽如此,我稍微清理了一下并添加了那些换行符,以下代码似乎按预期运行。我还注释掉了一些 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;
}