我一直在网络上尝试了很多不同的东西,但它们似乎从不起作用。每次我运行该程序时,它都会跳过为学生姓名输入内容的机会并直接进入该部门。另外,我们是C的新手并且真的被告知要使用printf和scanf,但是当用户输入像joe shmo这样的名字时,它会做一些奇怪的事情。
fputs("Please enter the students name: ", stdout);
fflush(stdout);
fgets(studentArray[empty].name, sizeof studentArray[empty].name, stdin);
printf("\nPlease enter the students department: ");
scanf("%s", studentArray[empty].department);
printf("\nPlease enter the students rank: ");
scanf("%d", &studentArray[empty].rank);
编辑:奇怪的东西,如果我输入两个名字,即joe shmo,它将把joe作为名称并自动添加shmo到部门。 studentArray是我制作的一个结构数组...
typedef struct {
char name[MAX_NAME_LENGTH];
char department[MAX_DEPT_LENGTH];
int rank;
} student;
答案 0 :(得分:4)
当程序到达fgets()
我打赌时,前一个'\n'
的输入缓冲区中有待处理的scanf()
。我建议你摆脱'\n'
以及之前的任何输入。
例如,使用
int getridofextrainput(void) {
int ch;
while (((ch = getchar()) != '\n') && (ch != EOF)) /* void */;
return ch;
}
然后在您认为必要的代码中使用该函数(在fgets
之前)。
答案 1 :(得分:0)
当您混合fscanf
和fgets
时会发生这种情况。
当fscanf
读取一个数字时,它会在此数字的末尾停止,之前以下的换行符。当事后fgets
读取一个字符串时,它会在下一个换行符处停止,不幸的是紧接着它。
如果您仅使用fscanf
来读取所有数据,则不会出现问题。这不是一件容易的事,因为你的一些名字包含空格。可以使用fscanf
读取包含空格的名称,如下所示:
scanf("%[^\n]", studentArray[empty].department);
如果您仅使用fgets
来读取所有数据,那么您也可以。不幸的是,这也不是微不足道的:它需要一个临时缓冲区来读取数字。
char temp[42];
fgets(temp, sizeof temp, stdin);
sscanf(temp, "%d", &studentArray[empty].rank);