Форматированный массив ввода int

Мне нужно иметь возможность ввести массив intи держать его в наборе внутри structОднако по какой-то причине он не будет читать числа в массив:

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

#define MAX 100

typedef struct set {
    int arr[MAX];
} set;

set SETA;

int read_set(set,...);
void print_set(set);

int main(){
    int x;
    x=read_set(SETA,2,3,4,-1);
    printf("%d numbers were read\n",x);

    print_set(SETA);
    return 0;
 }

void print_set(set s){
    int *iptr;
    iptr=s.arr;

    while(*iptr++){
        printf("%d ",*iptr);
    }
}


int read_set(set s,...){
    va_list ap;
    int i=0;
    int c=0;

    va_start(ap,s);

    while( *ap != -1){
        s.arr[i++]=va_arg(ap,int);
        printf("%d was entered\n",s.arr[i]);
        c++;
    }
    va_end(ap);
    return c;
}

вывод, который я получаю:

0 was entered  
0 was entered  
0 was entered  
3 numbers were read  

и не нужно говорить, что print_set ничего не печатает, любая помощь будет полезна!

1 ответ

Решение

В

while( *ap != -1){
    s.arr[i++]=va_arg(ap,int);
    printf("%d was entered\n",s.arr[i]);
    c++;
}

Вы увеличиваете i когда вы записываете значение. Когда вы пытаетесь распечатать s.arr[i] Вы на один шаг впереди того места, где вы сохранили значение.

Инкремент после печати?

while( *ap != -1){
    s.arr[i]=va_arg(ap,int);
    printf("%d was entered\n",s.arr[i]);
    i++;
    c++;
}

Вы работаете int read_set(set s,...) берет копию sets и помещает вещи в это. К тому времени, когда вы вернетесь к вызывающей функции в main, set что вы скопировали в неизменном виде. Вам нужно отправить указатели на переменные, чтобы изменить их:

int read_set(set *ps,...)

и тогда вызывающему коду нужно будет отправить адрес x = read_set(&SETA, 2, 3, 4, -1); так что вы можете изменить то, что в наборе. Альтернатива - вернуть заполненную структуру.

Еще две вещи, о которых стоит подумать. Во-первых, вы можете объявить свой набор внутри main - у него нет причин быть глобальным. И вам не нужно, чтобы подвести это.

int main() {
    set setA; //style/design point. Also don't shout.
    //... etc
}

Кроме того, посмотрите на вашу функцию печати. Оно использует while (*iptr++), поэтому проверка 0 или NULL для остановки цикла. Я не вижу никаких нулей, так что это нужно переосмыслить. И вы хотите иметь set что не будет отображать ничего, кроме 0?

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