在C帮助中获取一行用户输入。

时间:2011-05-02 22:11:14

标签: c

我一直在网络上尝试了很多不同的东西,但它们似乎从不起作用。每次我运行该程序时,它都会跳过为学生姓名输入内容的机会并直接进入该部门。另外,我们是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;

2 个答案:

答案 0 :(得分:4)

当程序到达fgets()我打赌时,前一个'\n'的输入缓冲区中有待处理的scanf()。我建议你摆脱'\n'以及之前的任何输入。

例如,使用

int getridofextrainput(void) {
  int ch;
  while (((ch = getchar()) != '\n') && (ch != EOF)) /* void */;
  return ch;
}

然后在您认为必要的代码中使用该函数(在fgets之前)。

答案 1 :(得分:0)

当您混合fscanffgets时会发生这种情况。

fscanf读取一个数字时,它会在此数字的末尾停止,之前以下的换行符。当事后fgets读取一个字符串时,它会在下一个换行符处停止,不幸的是紧接着它。

如果您仅使用fscanf来读取所有数据,则不会出现问题。这不是一件容易的事,因为你的一些名字包含空格。可以使用fscanf读取包含空格的名称,如下所示:

scanf("%[^\n]", studentArray[empty].department);

如果您仅使用fgets来读取所有数据,那么您也可以。不幸的是,这也不是微不足道的:它需要一个临时缓冲区来读取数字。

char temp[42];
fgets(temp, sizeof temp, stdin);
sscanf(temp, "%d", &studentArray[empty].rank);