格式化输入数组 int

Formatted input array 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 什么都不打印。

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); 以便您可以更改集合中的内容。 另一种方法是 return 填充结构。

还有两件事需要考虑。 首先,您可以在 main 中声明您的集合——它没有理由是全局的。 而且你不需要 captilaise 它。

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

另外,看看你的打印功能。 它使用 while (*iptr++),因此检查 0 或某种 NULL 以停止循环。我看不到任何零,因此需要重新考虑。而且,您想要 set 不显示任何超过 0 的内容吗?