Я заметил странную ошибку в моем коротком коде. Цель этого скрипта — создать массив структур, содержащих некоторую информацию об автомобилях.
("Struct Car Car1: char brand[50], char model[50], int ccm, int hp, int kw, char[50]")
После запуска скрипта все в порядке, пока не будет заполнен первый экземпляр, но когда переменная i увеличивается на 1, разрыв строки исчезает между строками, где я прошу пользователя указать «БРЕНД» и «МОДЕЛЬ». . Прошу прощения за то, что я нуб, я впервые использую структуры. Спасибо за любую помощь.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define _CRT_SECURE_NO_WARNINGS
#define MAX 10
int main() {
struct Car {
char brand[50];
char model[50];
int ccm;
int hp;
int kw;
char wheel[50];
};
struct Car Car1;
strcpy(Car1.brand, "Skoda");
strcpy(Car1.model, "Octavia");
Car1.ccm = 1960;
Car1.hp = 170;
Car1.kw = 114;
strcpy(Car1.wheel, "215/75R18");
printf("The car's brand is: %s\n", Car1.brand);
printf("The model is: %s\n", Car1.model);
printf("The volume of the engine is %d ccm\n", Car1.ccm);
printf("It has %d horsepower\n", Car1.hp);
printf("The car has %d kws\n", Car1.kw);
printf("You can put: %s wheels on it\n", Car1.wheel);
struct Car car_arr[MAX];
int i;
for (i = 0; i < MAX; i++) {
printf("Enter details of a car: %d\n", i+1);
printf("\n");
printf("Enter the brand: ");
fgets(car_arr[i].brand, sizeof car_arr[i].brand, stdin); //Brand
car_arr[i].brand[strcspn(car_arr[i].brand, "\n")] = '\0';
printf("Enter the model: ");
fgets(car_arr[i].model, sizeof car_arr[i].model, stdin); //Model
car_arr[i].model[strcspn(car_arr[i].model, "\n")] = '\0';
printf("Enter the parameters of the wheel: ");
fgets(car_arr[i].wheel, sizeof car_arr[i].wheel, stdin); //Wheel
car_arr[i].wheel[strcspn(car_arr[i].wheel, "\n")] = '\0';
printf("Enter the volume of the engine in ccms: ");
scanf_s("%d", &car_arr[i].ccm);
printf("Enter the horsepower: ");
scanf_s("%d", &car_arr[i].hp);
printf("Enter the amount of kilowatts: ");
scanf_s("%d", &car_arr[i].kw);
}
return 0;
}
Классическая проблема смешивания fgets и scanf. scanf читает только то, что вы просите. fgets читает всю строку, включая завершающую новую строку. Поэтому, если вы вызываете fgets после scanf, вы просто получаете новую строку, оставленную scanf.
(Не имеет отношения, но я думаю, что ваш пользователь не должен вводить мощность как в л.с., так и в кВт. Они оба являются одним и тем же количеством, и, спросив у пользователя оба, они могут ввести несоответствующие значения. Спросите врага и преобразуйте на выходе, например "114 кВт (170 л.с.)".)
Я пытался использовать версию scanf, но не мог понять, как сохранить отсканированную строку в своей структуре. VS всегда выводит сообщение об исключении.





Комментарии выше ответили на ваш вопрос, но в качестве примечания: Вы можете избавить себя от повторения, используя «typedef» вместе с «struct».
typedef struct { int x1; длинный х2; двойной и т. д.; } мой тип;
Это не имеет ничего общего со структурами как таковыми, но вы смешиваете построчное сканирование с
fgetsсо сканированием, разделенным пробелами, сscanf. C не очень хорош с интерактивным вводом, но общая рекомендация состоит в том, чтобы сначала прочитать строки ввода, а затем просмотреть эту строку для ввода, например, с помощьюsscanf.