nkorobkov
@nkorobkov

Неверно считываются символы из потока stdin, в чем проблема?

Задание: создать структуру, в которой будет находиться информация о химических элементах.
Сначала я сделал ввод-вывод при помощи cin/cout, и все отлично работало. Но мой преподаватель сказал, что нужно все сделать средствами языка C, поэтому мне пришлось переделывать все, используя функции fgets(), printf() и scanf()... И тут возникла проблема: при считывании данных из потока stdin, некоторые поля структуры не заполняются (в цикле они пропускаются). Вот как это выглядит:
651467d90d7b4615b829af94a5bae591.png
А вот мой код:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

struct ELEMENT {
	char name[10];
	char symbol[2];
	int number;
	char type[10];
	float mass;
	char electrons[10];
};

int main() {
	const int N = 2; //Количество элементов в массиве
	ELEMENT element[N];
	int i;

	// Заполнение массива химических элементов
	for (i = 0; i < N; i++) {
		printf("Enter element %d name: ", i);
		fgets(element[i].name, 10, stdin);
		printf("Enter element %d symbol: ", i);
		fgets(element[i].symbol, 2, stdin);
		printf("Enter element %d number: ", i); //номер элемента
		scanf("%d", &element[i].number);
		printf("Enter element %d type: ", i);
		fgets(element[i].type, 10, stdin);
		printf("Enter element %d mass: ", i);
		scanf("%f", &element[i].number);
		printf("Enter element %d electrons: ", i);
		fgets(element[i].electrons, 10, stdin);
	}
	for (i = 0; i < N; i++) {
		printf("Chimestry elements in our database:\n");
		printf("----------------------------------");
		printf("Name %d: ", i);
		puts(element[i].name);
		printf("Symbol %d: ", i);
		puts(element[i].symbol);
		printf("Number %d: %d\n", i, element[i].number);
		printf("Type %d: ", i);
		puts(element[i].type);
		printf("Mass %d: %f\n", i, element[i].mass);
		printf("Electrons %d: ", i);
		puts(element[i].electrons);
	}

	system("pause");
	return 0;
}

Подскажите пожалуйста, из-за чего это происходит и как это исправить
  • Вопрос задан
  • 358 просмотров
Пригласить эксперта
Ответы на вопрос 2
@kryvel
Системный администратор
Дело в том, как scanf и fgets обрабатывают символ новой строки.
fgets в отличие от scanf принимает знак новой строки как валидный символ и копирует его вместе со всеми остальными введенными данными в переменную.
scanf же оставляет этот символ в буфере.
Поэтому когда Вы вызваете fgets после scanf он сразу получает на входе символ новой строки и заканчивает считывать данные

выберите себе один способ ввода данных и не мешайте их.

вот доки на fgets
cstdio/fgets
Ответ написан
@abcd0x00
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы