在我的代码中,我通过函数向用户请求一系列数据gets()
,问题是在程序中的某个点,当用 请求数据时gets()
,它只是跳到下一个请求并将变量留空,我试过了清理以下方式的缓冲区,它不起作用:
fflush(stdin);
这是代码:
#include <stdio.h>
#include <string.h>
struct alumnos{
char nombre[10];
char dni[20];
int edad;
};
int main(){
struct alumnos myalumno[3];
int i;
for(i=0;i<=2;i++){
printf("Ingrese el nombre del alumno %i: ",i+1);
fflush(stdin);
gets(myalumno[i].nombre);
printf("Ingrese el DNI del alumno %i: ",i+1);
fflush(stdin);
gets(myalumno[i].dni);
printf("Ingrese la edad del alumno %i: ",i+1);
fflush(stdin);
scanf("%i",&myalumno[i].edad);
}
}
取自此处,
fflush
仅用于输出缓冲区。尝试使用
fpurge
:在哪里...
如果 a作为参数
fflush
给出NULL
,它将清除所有活动的输出缓冲区,但fpurge
它只获取输入缓冲区并清除它。您必须小心使用
fpurge
,它不是其他平台的“便携式”解决方案,因此在使用时应小心。参考:fpurge(英文)
有了它,它应该可以工作。
由于
fflush
输入流的标准没有定义 的行为,因此只能确定对输出流起作用(将缓冲区的剩余内容发送到输出)。因此你fflush
不应该使用它。也不建议使用它,
fpurge
因为它没有在标准 C 中定义,而且它也不能移植到所有平台(如其他评论中所述)。事实上,它在 Linux 上不可用,尽管有一个函数void __fpurge(FILE *stream)
可以做同样的事情并且它位于 GNU 标准库 (glibc) 中。可能的解决方案是您手动编写清除输入缓冲区的代码,直到找到换行符为止。您有两个选择:
和对我来说更好的一个:
在最后一个选项中, first 被告知
scanf
使用说明符忽略(使用 *)任意数量的非空白字符(制表符'\t'
、空格' '
或换行符'\n'
除外),%*[^\n]
直到找到空白字符(换行符),在这种情况下它会忽略它与%*c
.%*c
不能被替换,因为在这种\n
情况下,您将在此时命令忽略任意数量的空白字符,直到找到不存在的空白字符,从而导致 scanf 函数等待您输入任何非-空白字符, 将不会被读取,并将在输入缓冲区中保持挂起状态,以便下次调用scanf
.请记住,如果缓冲区包含空白字符 (
' ', '\t' o '\n'
) 以外的内容,这些解决方案是有效的。如果缓冲区为空,它将等待通过键盘输入除空白字符以外的数据(它将忽略的数据)。