Для начинающих
Если ваш main()
имеет тип возврата int
, не забудьте return
значение из него!
int main(void)
{
/* code here */
return 0;
}
Задача 1
К
d[k]=i;
k++;
printf("%d ", d[k]);
Я думаю, вы имели в виду
d[k]=i;
printf("%d ", d[k]);
k++;
в противном случае вы печатаете «следующий» элемент массива каждый раз, который будет один за концом массива на последней итерации цикла.
Задача 2
int i,k=0,d[k];
Вы создаете массив d
размером k
, где k
равен 0. Я думаю, вы намеревались автоматически изменить размер массива при записи k++
, но это не так. Массив создается с нулевыми элементами, и это его размер за все время.
Ваш следующий инстинкт может состоять в том, чтобы сначала создать достаточно большой массив:
int d[b-a+1];
К сожалению, это, скорее всего, тоже неправильно. Он опирается на функцию, называемую массивами переменной длины (или «VLA»); хотя расширение компилятора GCC (и, между прочим, C99) действительно позволяет это (и неясно, включено ли это расширение и / или разрешено ли использовать его в домашней работе - Я предполагаю для этого ответа, что вы делаете не / не ), сам язык не допускает массив с динамическим размером.
Что я подразумеваю под динамическим размером?
Я имею в виду, что переменные a
и b
зависят от ввода пользователя: они не известны во время компиляции. Как правило, размер массива должен быть известен во время компиляции.
Примечание. Если вы используете это, ваш код может скомпилироваться без ошибок, и ваша программа может даже работать и работать правильно. Однако вы будете полагаться на то, что называется «неопределенным поведением», и ваш код может прекратить работу или даже зависнуть в любое время из-за любого количества случайных, непредсказуемых факторов. Даже если все выглядит нормально, оно недействительно. Не делай этого!
Решение
К счастью, - это способ выделить блок памяти с правильным размером для ваших элементов, когда вы не знаете элементы, пока ваша программа не запустится. Это называется «динамическое выделение» и включает вызов функции:
int *d = malloc(sizeof(int) * (b-a+1));
Вы можете использовать тот же синтаксис (d[k]
) для доступа к «элементам» в этом «массиве» или блоке памяти, но позже вам придется вручную освободить память:
free(d);
Возможная проблема 3
Ваше присвоение говорит, что нужно вернуть массив из функции, но вы этого не делаете. Вместо этого вы просто создаете, заполняете и распечатываете массив в одной и той же функции (что кажется немного бессмысленным).
Вы также не можете вернуть массив, но, поскольку вы динамически выделяете для него пространство, у вас есть указатель для работы. По моему мнению, ваш учитель, возможно, хотел, чтобы вы вернули указатель на этот массив.
Если это так, готовый код выглядит примерно так:
#include <stdio.h>
#include <stdlib.h>
int *exc(int a, int b)
{
int i, k = 0;
int *d = malloc(sizeof(int) * ((b-a)+1));
for (i=a; i<=b; i++) {
d[k]=i;
k++;
}
return d;
}
int main(void)
{
int a,b,i,*ar;
printf("Give first integer: ");
scanf("%d",&a);
printf("Give second integer: ");
scanf("%d",&b);
ar = exc(a,b);
for (i=0; i < (b-a+1); i++) {
printf("%d ", ar[i]);
}
free(ar);
system("pause");
return 0;
}
Отказ от ответственности: я ржавый на C, поэтому готовый код может иметь несколько синтаксических ошибок.
Надеюсь, это поможет!