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

在C帮助中获取一行用户输入。,c,C,我浏览了所有的网页,尝试了很多不同的方法,但它们似乎都不起作用。每次我运行这个程序,它都会跳过为学生名字输入内容的机会,直接进入系里。另外,我们对C还是新手,他们告诉我们要使用printf和scanf,但是当用户输入像joe shmo这样的名字时,它会做一些奇怪的事情 fputs("Please enter the students name: ", stdout); fflush(stdout); fgets(studentArray[empty].name, sizeof studentAr

我浏览了所有的网页,尝试了很多不同的方法,但它们似乎都不起作用。每次我运行这个程序,它都会跳过为学生名字输入内容的机会,直接进入系里。另外,我们对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;

当程序到达
fgets()
时,我打赌输入缓冲区中有一个来自上一个
scanf()
的挂起的
'\n'
。我建议您删除该
'\n'
和以前的任何输入

例如,与

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

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

当程序到达
fgets()
时,我打赌在先前的
scanf()
输入缓冲区中有一个挂起的
'\n'
。我建议您删除该
'\n'
和以前的任何输入

例如,与

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

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

混合使用
fscanf
fgets
时会发生这种情况

fscanf
读取一个数字时,它就停在这个数字的末尾,在下面的换行符之前。当After
fgets
读取一个字符串时,它会在下一个换行符处停止,不幸的是,该换行符紧跟其后

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

scanf("%[^\n]", studentArray[empty].department);
如果只使用
fgets
读取所有数据,也可以。不幸的是,这也不是微不足道的:它需要一个临时缓冲区来读取数字

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

这就是混合使用
fscanf
fgets
时发生的情况

fscanf
读取一个数字时,它就停在这个数字的末尾,在下面的换行符之前。当After
fgets
读取一个字符串时,它会在下一个换行符处停止,不幸的是,该换行符紧跟其后

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

scanf("%[^\n]", studentArray[empty].department);
如果只使用
fgets
读取所有数据,也可以。不幸的是,这也不是微不足道的:它需要一个临时缓冲区来读取数字

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

请定义“奇怪的东西”。此外,请提供
studentArray
的定义。在此之前是否有任何代码未显示?请尽量不要将
scanf()
fgets()
混合使用--首选
fgets()
,然后解析输入。请定义“奇怪的东西”。另外,请提供
studentArray
的定义。在此之前是否有任何代码未显示?请尽量不要将
scanf()
fgets()
混合使用--首选
fgets()
,然后解析输入。可能需要将
ungetc
添加到其中function@anatolyg:为什么???!?!基本上,我想去掉缓冲区中的最后一个
'\n'
,这是最后读取的字符。为什么我要把我不想要的角色放回原处?我可能想添加
ungect
function@anatolyg:为什么???!?!基本上,我想去掉缓冲区中的最后一个
'\n'
,这是最后读取的字符。为什么我要把我不想要的角色放回去?