Как вводить массивы, длину которых я не знаю?

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

#include <stdio.h>
#include <stdlib.h>

int main ()
{
    int studenti;
    scanf("%d", &studenti);
    printf("%d ", studenti);
    int niza[studenti];
    for (int i = 1; i <= studenti; i++){
        scanf("%d", &niza[i]);
        i++;
        printf("%d ",niza[i]);
    }
}

Что я делаю не так? Есть ли другой способ добавить элементы массива, не зная заранее, насколько большим будет массив, потому что я не знаю, насколько они велики, когда я прохожу проверки на своем веб-сайте uni.

Можете ли вы показать нам вход, который вы даете, а также результат?

CoffeeTableEspresso 24.11.2022 20:53

Кроме того, почему вы увеличиваете i дважды?

CoffeeTableEspresso 24.11.2022 20:54

Когда размер массива равен studenti, допустимые индексы для массива — от 0 до studenti - 1. Однако вы используете индексы от 1 до studenti, поэтому вы получаете доступ к массиву за пределами границ. Следовательно, вы должны внести изменения, упомянутые в предыдущем комментарии.

Andreas Wenzel 24.11.2022 21:06
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
3
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы не знаете длину, вам, вероятно, следует создать связанный список вместо статического массива и malloc еще один элемент списка для каждого учащегося.

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

Основная проблема заключается в том, что цикл for начинается с 1 и продолжается до i <= studenti. В C массивы начинаются с индекса «0», а последний индекс в этом примере — studenti - 1.
Другая проблема заключается в том, что цикл for увеличивает i, а в теле цикла есть i++;. i увеличивается дважды.
Проверьте возврат от scanf. Он возвращает количество успешно отсканированных элементов. Здесь это будет 1, 0 или EOF.

#include <stdio.h>
#include <stdlib.h>

int main ()
{
    int studenti = 0; // initialize
    if ( 1 == scanf("%d", &studenti)) { // successful scan
        printf("%d ", studenti);
        int niza[studenti]; // variable length array
        for (int i = 0; i < studenti; i++) { // start from index 0
            if ( 1 == scanf("%d", &niza[i])) {
                printf("%d ",niza[i]);
            }
            else { // scanf returned 0 or EOF
                fprintf ( stderr, "problem scanning array element\n");
                return 2;
            }
        }
    }
    else { // scanf returned 0 or EOF
        fprintf ( stderr, "problem scanning\n");
        return 1;
    }
    printf("\n");
    return 0;
}

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