在C帮助中获取一行用户输入。
我浏览了所有的网页,尝试了很多不同的方法,但它们似乎都不起作用。每次我运行这个程序,它都会跳过为学生名字输入内容的机会,直接进入系里。另外,我们对C还是新手,他们告诉我们要使用printf和scanf,但是当用户输入像joe shmo这样的名字时,它会做一些奇怪的事情在C帮助中获取一行用户输入。,c,C,我浏览了所有的网页,尝试了很多不同的方法,但它们似乎都不起作用。每次我运行这个程序,它都会跳过为学生名字输入内容的机会,直接进入系里。另外,我们对C还是新手,他们告诉我们要使用printf和scanf,但是当用户输入像joe shmo这样的名字时,它会做一些奇怪的事情 fputs("Please enter the students name: ", stdout); fflush(stdout); fgets(studentArray[empty].name, sizeof studentAr
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
读取一个数字时,它就停在这个数字的末尾,在下面的换行符之前。当Afterfgets
读取一个字符串时,它会在下一个换行符处停止,不幸的是,该换行符紧跟其后
如果仅使用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
读取一个数字时,它就停在这个数字的末尾,在下面的换行符之前。当Afterfgets
读取一个字符串时,它会在下一个换行符处停止,不幸的是,该换行符紧跟其后
如果仅使用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'
,这是最后读取的字符。为什么我要把我不想要的角色放回去?