我需要能够输入int
的数组并将其保存在struct
内的一个集合中,但由于某种原因,它不会将数字读入数组:< / p>
#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什么都不打印。
答案 0 :(得分:3)
在
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以停止循环。我看不到任何零,所以这需要重新思考。而且,你想要一个不会显示超过0的任何东西的set
吗?