1

我是编程新手,一直在做课堂作业。出于某种奇怪的原因,程序一直在同一行打印 2 个不同的 printf,而不是让我有机会输入信息

这是代码:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{   char Name[20];
    char cid1[6]="", cid2[6]="", cid3[6]="", cid4[6]="", cid5[6]="", cid6[6]="";
    char Description1[21]="", Description2[21]="", Description3[21]="", Description4[21]="", Description5[21]="", Description6[21]="";
int hrs1 = 0, hrs2=0, hrs3=0, hrs4=0, hrs5=0, hrs6=0;
char grade1[2]="",grade2[2]="",grade3[2]="",grade4[2]="",grade5[2]="",grade6[2]="";

printf("Enter Students Name ");
fgets(Name, 20, stdin);

printf("Enter Class ID ");
scanf("%5s", cid1);

printf("Enter Class Description ");             // Problem
fgets(Description1, 20, stdin);                 // here

printf("Enter Class Hours ");
scanf("%d", &hrs1);

printf("Enter Class Grade ");
fgets(grade1, 1, stdin);

printf("%s\n", Name);
printf("%s\n", cid1);
printf("%s\n", Description1);
printf("%d\n", hrs1);
printf("%s\n", grade1);

system("pause");

return 0;

标有“Problem here”的区域是当前出现问题的地方。它不会提示输入课程描述,而是直接跳到输入课程时间并完全忽略底部的输入课程成绩。

它打印为:输入课程描述输入课程时间。

4

4 回答 4

0

输入缓冲区中还有一个换行符,来自上一个输入操作。摆脱它的一种方法是逐个字符地阅读,直到您阅读'\n'.

于 2013-02-20T20:28:04.823 回答
0

scanf您没有通过调用消耗换行符。当fgets它读取换行符时返回,它立即返回。

您可以更改scanf格式字符串以使用换行符,如下所示

scanf("%5s\r\n", cid1);
于 2013-02-20T20:31:25.760 回答
0

好像您在 Windows 上运行它。Windows 在正确刷新其标准输入方面存在问题。尝试使用

 fflush(stdin);

从控制台读取任何内容后。

于 2013-02-20T20:32:41.743 回答
0

scanf他们试图教你和之间的区别fgets。他们可能会通过告诉您 Class ID 必须是 4 个字符来欺骗您。

因此,如果您的 Class ID 是“1234”并且您点击Enter后,最终结果stdin是:

1234\r\n

中的%5s格式scanf说要读取 5 个字符,然后继续。因此,您在流中阅读1234\r并离开。然后在执行时,它会读入并继续前进。\nstdinfgets\n

从上面开始fgets

从流中获取字符串

从流中读取字符并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件结尾,以先发生者为准。

于 2013-02-20T20:37:25.487 回答