Программа для приема массива и отображения его на консоли с помощью функций. Программа должна содержать 3 функции, включая функцию main(). Следующие две функции для приема значений в массив и отображения значений массива на консоли соответственно.
#include <stdio.h>
#include <stdlib.h>
void getarray(int a[],int size);
void displayarray(int a[],int size);
int main(void) {
int a[20],size;
getarray(a,size);
displayarray(a,size);
return EXIT_SUCCESS;
}
void getarray(int a[],int size){
int i;
printf("enter the size of the array");
scanf("%d",&size);
for(i=0;i<size;i++){
scanf("%d",&a[i]);
}
}
void displayarray(int a[],int size){
int i;
for(i=0;i<size;i++){
printf("%d\t",a[i]);
}
}
Это то, что я пробовал. Я не получил надлежащего вывода.
Мой вывод:
Enter the size of the array3
1
2
3
И остановился здесь.
В чем ошибка? Или есть другой способ получить результат?
OT: не помещайте пустые строки между каждой строкой в вашем коде. Я отредактировал ваш код.



Вам нужно отправить int* в getarray, иначе переменная size будет локальной для функции, и введенное вами значение не будет доступно на сайте вызова:
void getarray(int a[], int *size) { // note: int*
int i;
printf("enter the size of the array");
if (scanf("%d", size) != 1) // it's already a pointer so no &
*size = 0;
for (i = 0; i < *size; i++) { // dereference to get the value
scanf("%d", &a[i]);
}
}
Затем назовите это так:
getarray(a, &size);
Тогда у меня есть сомнения. Вверху, где объявляется функция, void getarray(int a[], int size);. Если бы мне нужно было изменить переменную size на * size и здесь?
@Amalshanth Да, ты должен. Объявление должно соответствовать определению.
Да, это работает.. Спасибо.. И я заметил небольшую ошибку в коде, который вы дали. Вы написали сканирование («% d», размер). Я думаю, что не хватало '&'
@Amalshanth Нет, как я уже упоминал в комментарии, это уже указатель, поэтому не следует использовать &
Но я использовал это & и все еще работаю. Так разве не нужно?
@Amalshanth неправильно использовать scanf("%d", &size), когда size является int*. Затем вы указываете int** для scanf, который не является правильным типом для %d, поэтому программа будет иметь неопределенное поведение.
Как указано в комментариях, проблема в том, что size в main и size в getarray — это разные переменные, то есть изменение размера внутри функции не меняет его в main.
Ответ от @TedLyngmo показывает способ решения проблемы с помощью указателей.
Другое решение — позволить getarray вернуть размер. И, возможно, используйте беззнаковый тип для размера.
unsigned getarray(int a[]) {
unsigned i, size;
printf("enter the size of the array");
if (scanf("%u", &size) != 1) return 0;
for (i = 0; i < size; i++) {
scanf("%d", &a[i]);
}
return size;
}
и назовите это как
size = getarray(a);
Кстати: для реальной программы вы также должны добавить код для обработки случаев, когда пользователь вводит размер, который слишком велик для массива.
Где размер возврата; по функции? Я думаю, что он пропустил код, который вы дали.
@Amalshanth upsss... спасибо за уведомление
Ага. Я исправляю это. Работает. Спасибо
Вы уже определили массив с 20 элементами
int a[20],size;
Итак, это приглашение
printf("enter the size of the array");
не имеет смысла. Также вы передаете неинициализированную переменную size в функции. В результате вызов второй функции вызывает неопределенное поведение.
В вашем описании задания написано
Следующие две функции для приема значений в массив и отображения значения массива на консоли соответственно.
Это означает, что массив должен быть уже определен. Итак, это приглашение
printf("enter the size of the array");
должно быть как минимум в main.
Программа может выглядеть следующим образом
#include <stdio.h>
#include <stdlib.h>
void getarray( int a[], size_t size );
void displayarray( const int a[], size_t size );
int main(void)
{
size_t size;
printf( "enter the size of the array: " );
if ( scanf( "%zu", &size ) != 1 ) return EXIT_FAILURE;
int a[size];
getarray( a, size );
displayarray( a, size );
return EXIT_SUCCESS;
}
void getarray( int a[], size_t size )
{
puts( "enter elements of the array:" );
for ( size_t i = 0; i < size; i++ )
{
scanf( "%d", &a[i] );
}
}
void displayarray( const int a[], size_t size )
{
for ( size_t i = 0; i < size; i++ )
{
printf( "%d\t", a[i] );
}
putchar( '\n' );
}
В качестве альтернативы вы можете динамически выделить массив, используя malloc, например,
int main(void)
{
size_t size;
printf( "enter the size of the array: " );
if ( scanf( "%zu", &size ) != 1 ) return EXIT_FAILURE;
int *a = malloc( size * sizeof( int ) );
if ( a == NULL ) return EXIT_FAILURE;
getarray( a, size );
displayarray( a, size );
free( a );
return EXIT_SUCCESS;
}
Две другие функции остаются без изменений.
VLA без проверки лимита немного опасен.
@SupportUkraine На самом деле он пытается использовать VLA.
Вы не можете использовать
sizeтаким образом.int sizeвmainостается неинициализированным. Итак, функцияdisplayarrayимеет неопределенное поведение.