Массив с использованием функций на C

Программа для приема массива и отображения его на консоли с помощью функций. Программа должна содержать 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

И остановился здесь.

В чем ошибка? Или есть другой способ получить результат?

Вы не можете использовать size таким образом. int size в main остается неинициализированным. Итак, функция displayarray имеет неопределенное поведение.

Weather Vane 20.07.2023 10:33

OT: не помещайте пустые строки между каждой строкой в ​​вашем коде. Я отредактировал ваш код.

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

Ответы 3

Вам нужно отправить 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 20.07.2023 11:05

@Amalshanth Да, ты должен. Объявление должно соответствовать определению.

Ted Lyngmo 20.07.2023 11:09

Да, это работает.. Спасибо.. И я заметил небольшую ошибку в коде, который вы дали. Вы написали сканирование («% d», размер). Я думаю, что не хватало '&'

Amalshanth 20.07.2023 11:39

@Amalshanth Нет, как я уже упоминал в комментарии, это уже указатель, поэтому не следует использовать &

Ted Lyngmo 20.07.2023 11:47

Но я использовал это & ​​и все еще работаю. Так разве не нужно?

Amalshanth 20.07.2023 12:15

@Amalshanth неправильно использовать scanf("%d", &size), когда size является int*. Затем вы указываете int** для scanf, который не является правильным типом для %d, поэтому программа будет иметь неопределенное поведение.

Ted Lyngmo 20.07.2023 12:19

Как указано в комментариях, проблема в том, что 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 20.07.2023 11:14

@Amalshanth upsss... спасибо за уведомление

Support Ukraine 20.07.2023 11:17

Ага. Я исправляю это. Работает. Спасибо

Amalshanth 20.07.2023 11:35
Ответ принят как подходящий

Вы уже определили массив с 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 без проверки лимита немного опасен.

Support Ukraine 20.07.2023 10:50

@SupportUkraine На самом деле он пытается использовать VLA.

Vlad from Moscow 20.07.2023 10:54

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