格式化输入数组int

时间:2018-05-19 06:58:09

标签: c struct formatted-input

我需要能够输入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什么都不打印。

1 个答案:

答案 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吗?