4

我需要能够输入ints 数组并将其保存在 a 内的集合中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 什么也不打印。

4

1 回答 1

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,...)获取 a 的副本set s并将内容放入其中。当你回到 main 中的调用函数时set,你复制的那个没有改变。您需要发送指向变量的指针来更改它们:

int read_set(set *ps,...)

然后调用代码需要发送地址x = read_set(&SETA, 2, 3, 4, -1);,以便您可以更改集合中的内容。另一种方法是返回填充的结构。

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

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

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

于 2018-05-19T07:03:30.320 回答