В моем коде я запрашиваю ряд данных у пользователя через функцию 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
:Где...
Если в качестве параметра
fflush
указаноNULL
a, он очистит все активные выходные буферы, ноfpurge
берет и очищает только входной буфер.Вы должны быть осторожны с использованием
fpurge
, это не «переносимое» решение для других платформ, поэтому вы должны быть осторожны при его использовании.Ссылка: fpurge (на английском языке)
С этим должно работать.
Поскольку поведение
fflush
не определено стандартом для входных потоков, оно обязательно будет работать только для выходных потоков (отправка оставшегося содержимого буфера на выход). Поэтому выfflush
не должны использовать его.Его также не рекомендуется использовать,
fpurge
так как он не определен в стандарте C, а также не переносим на все платформы (как объясняется в других комментариях). На самом деле она недоступна в Linux, хотя есть функцияvoid __fpurge(FILE *stream)
, которая делает то же самое, и она находится в стандартной библиотеке GNU (glibc).Возможное решение состоит в том, чтобы вы вручную написали код, очищающий входной буфер до тех пор, пока он не найдет новую строку. У вас есть два варианта:
и тот, который мне кажется лучше:
В последнем варианте сначала предлагается
scanf
игнорировать (используя *) любое количество непустых символов (кроме табуляции'\t'
, пробела' '
или новой строки'\n'
) со спецификатором%*[^\n]
до тех пор, пока не будет найден пустой символ (новая строка), и в этом случае он игнорирует это с%*c
.Не
%*c
может быть заменено на\n
, потому что в этом случае вы бы приказали в этот момент игнорировать любое количество пустых символов, пока он не найдет тот, который не является пустым, заставляя функцию scanf зависать, ожидая, когда вы введете любой не-пустой символ. пустые символы, которые не будут прочитаны и останутся в буфере ввода для следующего вызоваscanf
.Имейте в виду, что эти решения действительны в том случае, если содержимое буфера отличается от пустых символов (
' ', '\t' o '\n'
). Если буфер пуст, он будет ожидать ввода с клавиатуры данных, отличных от пустых символов (данные, которые он будет игнорировать).