Проблема разрыва строки "C"

Я заметил странную ошибку в моем коротком коде. Цель этого скрипта — создать массив структур, содержащих некоторую информацию об автомобилях.

("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. C не очень хорош с интерактивным вводом, но общая рекомендация состоит в том, чтобы сначала прочитать строки ввода, а затем просмотреть эту строку для ввода, например, с помощью sscanf.

M Oehm 17.12.2020 19:17

Классическая проблема смешивания fgets и scanf. scanf читает только то, что вы просите. fgets читает всю строку, включая завершающую новую строку. Поэтому, если вы вызываете fgets после scanf, вы просто получаете новую строку, оставленную scanf.

stark 17.12.2020 19:17

(Не имеет отношения, но я думаю, что ваш пользователь не должен вводить мощность как в л.с., так и в кВт. Они оба являются одним и тем же количеством, и, спросив у пользователя оба, они могут ввести несоответствующие значения. Спросите врага и преобразуйте на выходе, например "114 кВт (170 л.с.)".)

M Oehm 17.12.2020 19:20

Я пытался использовать версию scanf, но не мог понять, как сохранить отсканированную строку в своей структуре. VS всегда выводит сообщение об исключении.

Zoltán Berkula 17.12.2020 21:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Комментарии выше ответили на ваш вопрос, но в качестве примечания: Вы можете избавить себя от повторения, используя «typedef» вместе с «struct».

typedef struct { int x1; длинный х2; двойной и т. д.; } мой тип;

Другие вопросы по теме