Форматированный массив ввода 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,...)
берет копию set
s
и помещает вещи в это. К тому времени, когда вы вернетесь к вызывающей функции в 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?