Я пытаюсь сделать программу, которая принимает количество студентов, зачисленных на экзамен, и сколько баллов получил каждый из них. Я пытаюсь зациклить входы, но на выходе выдает, казалось бы, случайные числа.
#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.
Кроме того, почему вы увеличиваете i
дважды?
Когда размер массива равен studenti
, допустимые индексы для массива — от 0
до studenti - 1
. Однако вы используете индексы от 1
до studenti
, поэтому вы получаете доступ к массиву за пределами границ. Следовательно, вы должны внести изменения, упомянутые в предыдущем комментарии.
Если вы не знаете длину, вам, вероятно, следует создать связанный список вместо статического массива и 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;
}
Можете ли вы показать нам вход, который вы даете, а также результат?